{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Mensam.API.Data.Space.Permission where

import Mensam.API.Aeson

import Data.Aeson qualified as A
import Data.Kind
import Data.Singletons.TH
import Data.Text qualified as T
import Data.Typeable
import Deriving.Aeson qualified as A
import GHC.Generics

type Permission :: Type
data Permission
  = MkPermissionViewSpace
  | MkPermissionEditDesk
  | MkPermissionEditUser
  | MkPermissionEditRole
  | MkPermissionEditSpace
  | MkPermissionCreateReservation
  | MkPermissionCancelReservation
  deriving stock (Permission
Permission -> Permission -> Bounded Permission
forall a. a -> a -> Bounded a
$cminBound :: Permission
minBound :: Permission
$cmaxBound :: Permission
maxBound :: Permission
Bounded, Int -> Permission
Permission -> Int
Permission -> [Permission]
Permission -> Permission
Permission -> Permission -> [Permission]
Permission -> Permission -> Permission -> [Permission]
(Permission -> Permission)
-> (Permission -> Permission)
-> (Int -> Permission)
-> (Permission -> Int)
-> (Permission -> [Permission])
-> (Permission -> Permission -> [Permission])
-> (Permission -> Permission -> [Permission])
-> (Permission -> Permission -> Permission -> [Permission])
-> Enum Permission
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Permission -> Permission
succ :: Permission -> Permission
$cpred :: Permission -> Permission
pred :: Permission -> Permission
$ctoEnum :: Int -> Permission
toEnum :: Int -> Permission
$cfromEnum :: Permission -> Int
fromEnum :: Permission -> Int
$cenumFrom :: Permission -> [Permission]
enumFrom :: Permission -> [Permission]
$cenumFromThen :: Permission -> Permission -> [Permission]
enumFromThen :: Permission -> Permission -> [Permission]
$cenumFromTo :: Permission -> Permission -> [Permission]
enumFromTo :: Permission -> Permission -> [Permission]
$cenumFromThenTo :: Permission -> Permission -> Permission -> [Permission]
enumFromThenTo :: Permission -> Permission -> Permission -> [Permission]
Enum, Permission -> Permission -> Bool
(Permission -> Permission -> Bool)
-> (Permission -> Permission -> Bool) -> Eq Permission
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Permission -> Permission -> Bool
== :: Permission -> Permission -> Bool
$c/= :: Permission -> Permission -> Bool
/= :: Permission -> Permission -> Bool
Eq, (forall x. Permission -> Rep Permission x)
-> (forall x. Rep Permission x -> Permission) -> Generic Permission
forall x. Rep Permission x -> Permission
forall x. Permission -> Rep Permission x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Permission -> Rep Permission x
from :: forall x. Permission -> Rep Permission x
$cto :: forall x. Rep Permission x -> Permission
to :: forall x. Rep Permission x -> Permission
Generic, Eq Permission
Eq Permission =>
(Permission -> Permission -> Ordering)
-> (Permission -> Permission -> Bool)
-> (Permission -> Permission -> Bool)
-> (Permission -> Permission -> Bool)
-> (Permission -> Permission -> Bool)
-> (Permission -> Permission -> Permission)
-> (Permission -> Permission -> Permission)
-> Ord Permission
Permission -> Permission -> Bool
Permission -> Permission -> Ordering
Permission -> Permission -> Permission
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Permission -> Permission -> Ordering
compare :: Permission -> Permission -> Ordering
$c< :: Permission -> Permission -> Bool
< :: Permission -> Permission -> Bool
$c<= :: Permission -> Permission -> Bool
<= :: Permission -> Permission -> Bool
$c> :: Permission -> Permission -> Bool
> :: Permission -> Permission -> Bool
$c>= :: Permission -> Permission -> Bool
>= :: Permission -> Permission -> Bool
$cmax :: Permission -> Permission -> Permission
max :: Permission -> Permission -> Permission
$cmin :: Permission -> Permission -> Permission
min :: Permission -> Permission -> Permission
Ord, ReadPrec [Permission]
ReadPrec Permission
Int -> ReadS Permission
ReadS [Permission]
(Int -> ReadS Permission)
-> ReadS [Permission]
-> ReadPrec Permission
-> ReadPrec [Permission]
-> Read Permission
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Permission
readsPrec :: Int -> ReadS Permission
$creadList :: ReadS [Permission]
readList :: ReadS [Permission]
$creadPrec :: ReadPrec Permission
readPrec :: ReadPrec Permission
$creadListPrec :: ReadPrec [Permission]
readListPrec :: ReadPrec [Permission]
Read, Int -> Permission -> ShowS
[Permission] -> ShowS
Permission -> [Char]
(Int -> Permission -> ShowS)
-> (Permission -> [Char])
-> ([Permission] -> ShowS)
-> Show Permission
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Permission -> ShowS
showsPrec :: Int -> Permission -> ShowS
$cshow :: Permission -> [Char]
show :: Permission -> [Char]
$cshowList :: [Permission] -> ShowS
showList :: [Permission] -> ShowS
Show)
  deriving
    (Value -> Parser [Permission]
Value -> Parser Permission
(Value -> Parser Permission)
-> (Value -> Parser [Permission]) -> FromJSON Permission
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser Permission
parseJSON :: Value -> Parser Permission
$cparseJSONList :: Value -> Parser [Permission]
parseJSONList :: Value -> Parser [Permission]
A.FromJSON, [Permission] -> Value
[Permission] -> Encoding
Permission -> Value
Permission -> Encoding
(Permission -> Value)
-> (Permission -> Encoding)
-> ([Permission] -> Value)
-> ([Permission] -> Encoding)
-> ToJSON Permission
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: Permission -> Value
toJSON :: Permission -> Value
$ctoEncoding :: Permission -> Encoding
toEncoding :: Permission -> Encoding
$ctoJSONList :: [Permission] -> Value
toJSONList :: [Permission] -> Value
$ctoEncodingList :: [Permission] -> Encoding
toEncodingList :: [Permission] -> Encoding
A.ToJSON)
    via A.CustomJSON (JSONSettings "MkPermission" "") Permission

type ErrorInsufficientPermission :: Permission -> Type
data ErrorInsufficientPermission p = MkErrorInsufficientPermission
  deriving stock (ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
(ErrorInsufficientPermission p
 -> ErrorInsufficientPermission p -> Bool)
-> (ErrorInsufficientPermission p
    -> ErrorInsufficientPermission p -> Bool)
-> Eq (ErrorInsufficientPermission p)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
$c== :: forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
== :: ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
$c/= :: forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
/= :: ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
Eq, (forall x.
 ErrorInsufficientPermission p
 -> Rep (ErrorInsufficientPermission p) x)
-> (forall x.
    Rep (ErrorInsufficientPermission p) x
    -> ErrorInsufficientPermission p)
-> Generic (ErrorInsufficientPermission p)
forall x.
Rep (ErrorInsufficientPermission p) x
-> ErrorInsufficientPermission p
forall x.
ErrorInsufficientPermission p
-> Rep (ErrorInsufficientPermission p) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (p :: Permission) x.
Rep (ErrorInsufficientPermission p) x
-> ErrorInsufficientPermission p
forall (p :: Permission) x.
ErrorInsufficientPermission p
-> Rep (ErrorInsufficientPermission p) x
$cfrom :: forall (p :: Permission) x.
ErrorInsufficientPermission p
-> Rep (ErrorInsufficientPermission p) x
from :: forall x.
ErrorInsufficientPermission p
-> Rep (ErrorInsufficientPermission p) x
$cto :: forall (p :: Permission) x.
Rep (ErrorInsufficientPermission p) x
-> ErrorInsufficientPermission p
to :: forall x.
Rep (ErrorInsufficientPermission p) x
-> ErrorInsufficientPermission p
Generic, Eq (ErrorInsufficientPermission p)
Eq (ErrorInsufficientPermission p) =>
(ErrorInsufficientPermission p
 -> ErrorInsufficientPermission p -> Ordering)
-> (ErrorInsufficientPermission p
    -> ErrorInsufficientPermission p -> Bool)
-> (ErrorInsufficientPermission p
    -> ErrorInsufficientPermission p -> Bool)
-> (ErrorInsufficientPermission p
    -> ErrorInsufficientPermission p -> Bool)
-> (ErrorInsufficientPermission p
    -> ErrorInsufficientPermission p -> Bool)
-> (ErrorInsufficientPermission p
    -> ErrorInsufficientPermission p -> ErrorInsufficientPermission p)
-> (ErrorInsufficientPermission p
    -> ErrorInsufficientPermission p -> ErrorInsufficientPermission p)
-> Ord (ErrorInsufficientPermission p)
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Ordering
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> ErrorInsufficientPermission p
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall (p :: Permission). Eq (ErrorInsufficientPermission p)
forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Ordering
forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> ErrorInsufficientPermission p
$ccompare :: forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Ordering
compare :: ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Ordering
$c< :: forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
< :: ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
$c<= :: forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
<= :: ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
$c> :: forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
> :: ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
$c>= :: forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
>= :: ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> Bool
$cmax :: forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> ErrorInsufficientPermission p
max :: ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> ErrorInsufficientPermission p
$cmin :: forall (p :: Permission).
ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> ErrorInsufficientPermission p
min :: ErrorInsufficientPermission p
-> ErrorInsufficientPermission p -> ErrorInsufficientPermission p
Ord, ReadPrec [ErrorInsufficientPermission p]
ReadPrec (ErrorInsufficientPermission p)
Int -> ReadS (ErrorInsufficientPermission p)
ReadS [ErrorInsufficientPermission p]
(Int -> ReadS (ErrorInsufficientPermission p))
-> ReadS [ErrorInsufficientPermission p]
-> ReadPrec (ErrorInsufficientPermission p)
-> ReadPrec [ErrorInsufficientPermission p]
-> Read (ErrorInsufficientPermission p)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall (p :: Permission). ReadPrec [ErrorInsufficientPermission p]
forall (p :: Permission). ReadPrec (ErrorInsufficientPermission p)
forall (p :: Permission).
Int -> ReadS (ErrorInsufficientPermission p)
forall (p :: Permission). ReadS [ErrorInsufficientPermission p]
$creadsPrec :: forall (p :: Permission).
Int -> ReadS (ErrorInsufficientPermission p)
readsPrec :: Int -> ReadS (ErrorInsufficientPermission p)
$creadList :: forall (p :: Permission). ReadS [ErrorInsufficientPermission p]
readList :: ReadS [ErrorInsufficientPermission p]
$creadPrec :: forall (p :: Permission). ReadPrec (ErrorInsufficientPermission p)
readPrec :: ReadPrec (ErrorInsufficientPermission p)
$creadListPrec :: forall (p :: Permission). ReadPrec [ErrorInsufficientPermission p]
readListPrec :: ReadPrec [ErrorInsufficientPermission p]
Read, Int -> ErrorInsufficientPermission p -> ShowS
[ErrorInsufficientPermission p] -> ShowS
ErrorInsufficientPermission p -> [Char]
(Int -> ErrorInsufficientPermission p -> ShowS)
-> (ErrorInsufficientPermission p -> [Char])
-> ([ErrorInsufficientPermission p] -> ShowS)
-> Show (ErrorInsufficientPermission p)
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
forall (p :: Permission).
Int -> ErrorInsufficientPermission p -> ShowS
forall (p :: Permission). [ErrorInsufficientPermission p] -> ShowS
forall (p :: Permission). ErrorInsufficientPermission p -> [Char]
$cshowsPrec :: forall (p :: Permission).
Int -> ErrorInsufficientPermission p -> ShowS
showsPrec :: Int -> ErrorInsufficientPermission p -> ShowS
$cshow :: forall (p :: Permission). ErrorInsufficientPermission p -> [Char]
show :: ErrorInsufficientPermission p -> [Char]
$cshowList :: forall (p :: Permission). [ErrorInsufficientPermission p] -> ShowS
showList :: [ErrorInsufficientPermission p] -> ShowS
Show)

instance Typeable p => A.FromJSON (ErrorInsufficientPermission p) where
  parseJSON :: Value -> Parser (ErrorInsufficientPermission p)
parseJSON =
    [Char]
-> (Text -> Parser (ErrorInsufficientPermission p))
-> Value
-> Parser (ErrorInsufficientPermission p)
forall a. [Char] -> (Text -> Parser a) -> Value -> Parser a
A.withText [Char]
errorName ((Text -> Parser (ErrorInsufficientPermission p))
 -> Value -> Parser (ErrorInsufficientPermission p))
-> (Text -> Parser (ErrorInsufficientPermission p))
-> Value
-> Parser (ErrorInsufficientPermission p)
forall a b. (a -> b) -> a -> b
$ \Text
text ->
      case Text -> Text -> Maybe Text
T.stripPrefix Text
"Insufficient permission: " Text
text of
        Maybe Text
Nothing -> [Char] -> Parser (ErrorInsufficientPermission p)
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser (ErrorInsufficientPermission p))
-> [Char] -> Parser (ErrorInsufficientPermission p)
forall a b. (a -> b) -> a -> b
$ [Char]
"Parsing " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
errorName [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
"failed, expected prefix \"Insufficient permission: \""
        Just Text
suffix ->
          if Text -> [Char]
T.unpack Text
suffix [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
permissionName
            then ErrorInsufficientPermission p
-> Parser (ErrorInsufficientPermission p)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ErrorInsufficientPermission p
forall (p :: Permission). ErrorInsufficientPermission p
MkErrorInsufficientPermission
            else [Char] -> Parser (ErrorInsufficientPermission p)
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser (ErrorInsufficientPermission p))
-> [Char] -> Parser (ErrorInsufficientPermission p)
forall a b. (a -> b) -> a -> b
$ [Char]
"Parsing " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
errorName [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
"failed, expected suffix \"" [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
permissionName [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
"\""
   where
    errorName :: [Char]
errorName = TyCon -> [Char]
tyConName (TypeRep -> TyCon
typeRepTyCon (Proxy (ErrorInsufficientPermission p) -> TypeRep
forall {k} (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy (ErrorInsufficientPermission p) -> TypeRep)
-> Proxy (ErrorInsufficientPermission p) -> TypeRep
forall a b. (a -> b) -> a -> b
$ forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(ErrorInsufficientPermission p)))
    permissionName :: [Char]
permissionName = TyCon -> [Char]
tyConName (TypeRep -> TyCon
typeRepTyCon (Proxy p -> TypeRep
forall {k} (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy p -> TypeRep) -> Proxy p -> TypeRep
forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
forall (t :: Permission). Proxy t
Proxy @p))

instance Typeable p => A.ToJSON (ErrorInsufficientPermission p) where
  toJSON :: ErrorInsufficientPermission p -> Value
toJSON ErrorInsufficientPermission p
MkErrorInsufficientPermission =
    Text -> Value
A.String (Text -> Value) -> Text -> Value
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack ([Char] -> Text) -> [Char] -> Text
forall a b. (a -> b) -> a -> b
$ [Char]
"Insufficient permission: " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
permissionName
   where
    permissionName :: [Char]
permissionName = TyCon -> [Char]
tyConName (TypeRep -> TyCon
typeRepTyCon (Proxy p -> TypeRep
forall {k} (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy p -> TypeRep) -> Proxy p -> TypeRep
forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
forall (t :: Permission). Proxy t
Proxy @p))

genSingletons [''Permission]