40 lines
1.0 KiB
Plaintext
40 lines
1.0 KiB
Plaintext
|
-- | TODO: Phone module should include at least some sort of smart
|
||
|
-- | constructors, rejecting invalid phone numbers.
|
||
|
module App.PermissionLevel where
|
||
|
|
||
|
import Prelude
|
||
|
|
||
|
import Data.Codec.Argonaut (JsonCodec)
|
||
|
import Data.Codec.Argonaut as CA
|
||
|
import Data.Codec.Argonaut.Variant as CAV
|
||
|
import Data.Variant as V
|
||
|
import Data.Profunctor (dimap)
|
||
|
import Data.Either (Either(..))
|
||
|
import Type.Proxy (Proxy(..))
|
||
|
|
||
|
data PermissionLevel
|
||
|
= None
|
||
|
| Read
|
||
|
| Edit
|
||
|
| Admin
|
||
|
|
||
|
codec ∷ CA.JsonCodec PermissionLevel
|
||
|
codec =
|
||
|
dimap toVariant fromVariant $ CAV.variantMatch { permission: Right CA.string }
|
||
|
where
|
||
|
toVariant = case _ of
|
||
|
None → V.inj (Proxy ∷ _ "permission") "none"
|
||
|
Read → V.inj (Proxy ∷ _ "permission") "read"
|
||
|
Edit → V.inj (Proxy ∷ _ "permission") "edit"
|
||
|
Admin → V.inj (Proxy ∷ _ "permission") "admin"
|
||
|
|
||
|
fromVariant = V.match
|
||
|
{ permission:
|
||
|
\s -> case s of
|
||
|
"none" -> None
|
||
|
"read" -> Read
|
||
|
"edit" -> Edit
|
||
|
"admin" -> Admin
|
||
|
_ -> None
|
||
|
}
|