summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/ataxia_lock.erl')
-rw-r--r--src/ataxia_lock.erl62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/ataxia_lock.erl b/src/ataxia_lock.erl
new file mode 100644
index 0000000..b6ce2c6
--- /dev/null
+++ b/src/ataxia_lock.erl
@@ -0,0 +1,62 @@
+-module(ataxia_lock).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-type status() :: none | locked.
+
+-record
+(
+ lock,
+ {
+ status :: status(),
+ permission :: ataxia_security:permission(),
+ time :: ataxia_time:type()
+ }
+).
+
+-type type() :: #lock{}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export_type([type/0]).
+
+-export([locked/2, unlocked/0, allows/2]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec locked (ataxia_security:user(), ataxia_time:type()) -> type().
+locked (User, Time) ->
+ #lock
+ {
+ status = locked,
+ permission = ataxia_security:allow_only(User),
+ time = ataxia_time:add(ataxia_time:now(), Time)
+ }.
+
+-spec unlocked () -> type().
+unlocked () ->
+ #lock
+ {
+ status = none,
+ permission = ataxia_security:allow_only(ataxia_security:any()),
+ time = ataxia_time:now()
+ }.
+
+-spec allows (ataxia_security:user(), type()) -> boolean().
+allows (User, Lock) ->
+ case Lock#lock.status of
+ none -> true;
+ locked ->
+ (
+ ataxia_security:can_access(Lock#lock.permission, User)
+ or ataxia_time:is_past(Lock#lock.time)
+ )
+ end.
+