-
Notifications
You must be signed in to change notification settings - Fork 10
/
sr_state.erl
85 lines (68 loc) · 2.22 KB
/
sr_state.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
-module(sr_state).
%% constructor, getters and setters
-export([ new/2
, id/1
, id/2
, entity/1
, entity/2
, module/1
, opts/1
]).
%% functions to work with user opts
-export([ set/3
, retrieve/3
, remove/2
]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Types
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-opaque state() ::
#{ opts := sumo_rest:options()
, id => binary()
, entity => sumo:user_doc()
, module := module()
, user_opts := map()
}.
-export_type([state/0]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Constructor, Getters/Setters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec new(sumo_rest:options(), module()) -> state().
new(Opts, Module) ->
#{opts => Opts, module => Module, user_opts => #{}}.
-spec id(state()) -> binary() | undefined.
id(#{id := Id}) ->
Id;
id(_State) ->
undefined.
-spec id(state(), binary()) -> state().
id(State, Id) ->
State#{id => Id}.
-spec entity(state()) -> sumo:user_doc() | undefined.
entity(#{entity := Entity}) ->
Entity;
entity(_State) ->
undefined.
-spec entity(state(), sumo:user_doc()) -> state().
entity(State, Entity) ->
State#{entity => Entity}.
-spec module(state()) -> module().
module(#{module := Module}) ->
Module.
-spec opts(state()) -> sumo_rest:options().
opts(#{opts := Opts}) ->
Opts.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% User opts Functions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec set(Key :: term(), Value :: term(), state()) -> state().
set(Key, Value, #{user_opts := UserOpts} = State) ->
NewUserOpts = UserOpts#{Key => Value},
State#{user_opts => NewUserOpts}.
-spec retrieve(Key :: term(), state(), Default :: term()) -> term().
retrieve(Key, #{user_opts := UserOpts}, Default) ->
maps:get(Key, UserOpts, Default).
-spec remove(Key :: term(), state()) -> state().
remove(Key, #{user_opts := UserOpts} = State) ->
NewUserOpts = maps:remove(Key, UserOpts),
State#{user_opts => NewUserOpts}.