aboutsummaryrefslogtreecommitdiff
path: root/apps/dreki/src/dreki_task.erl
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dreki/src/dreki_task.erl')
-rw-r--r--apps/dreki/src/dreki_task.erl58
1 files changed, 58 insertions, 0 deletions
diff --git a/apps/dreki/src/dreki_task.erl b/apps/dreki/src/dreki_task.erl
new file mode 100644
index 0000000..b762aea
--- /dev/null
+++ b/apps/dreki/src/dreki_task.erl
@@ -0,0 +1,58 @@
+-module(dreki_task).
+
+-include("dreki.hrl").
+
+-type new_params() :: #{handler := dreki_task_handler(),
+ id => dreki_id(),
+ description => binary(),
+ params => #{}}.
+
+-export([new/1, validate/1, to_map/1]).
+-export([id/1, description/1, handler/1, params/1]).
+-export([description/2, handler/2, params/2]).
+
+-spec new(new_params()) -> {ok, dreki_task()} | {error, Reason::term()}.
+new(Map) ->
+ Id = maps:get(id, Map, dreki_id:get()),
+ Description = maps:get(description, Map, undefined),
+ Params = maps:get(params, Map, #{}),
+ Handler = maps:get(handler, Map, undefined),
+ Task = #dreki_task{id=Id, handler=Handler, params=Params, description=Description,
+ persisted=false, dirty=true},
+ validate(Task).
+
+-spec validate(dreki_task()) -> {ok, dreki_task()} | {error, Reason::term()}.
+validate(#dreki_task{handler = undefined}) ->
+ {error, {required, handler}};
+validate(Task = #dreki_task{id = Id, handler = _Handler}) ->
+ case dreki_id:valid(Id) of
+ {error, Err} -> {error, Err};
+ ok -> {ok, Task}
+ end.
+
+id(Task = #dreki_task{}) ->
+ Task#dreki_task.id.
+
+description(Task = #dreki_task{}) ->
+ Task#dreki_task.description.
+
+handler(Task = #dreki_task{}) ->
+ Task#dreki_task.handler.
+
+params(Task = #dreki_task{}) ->
+ Task#dreki_task.params.
+
+handler(Task = #dreki_task{}, NewHandler) ->
+ Task#dreki_task{handler=NewHandler, dirty=true}.
+
+description(Task = #dreki_task{}, NewDescription) ->
+ Task#dreki_task{description=NewDescription, dirty=true}.
+
+params(Task = #dreki_task{}, NewParams) ->
+ Task#dreki_task{params=NewParams, dirty=true}.
+
+to_map(Task = #dreki_task{id = Id, handler = Handler, description = Description, params = Params}) ->
+ #{id => Id,
+ handler => Handler,
+ description => Description,
+ params => Params}.