module Control.Access.RoleBased.Internal.Role where ------------------------------------------------------------------------------ import Control.Monad.ST import Data.Hashable import Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as M import Data.String import Data.Text (Text) import qualified Data.Vector as V import qualified Data.Vector.Algorithms.Merge as VA ------------------------------------------------------------------------------ data RoleValue = RoleBool Bool | RoleText Text | RoleInt Int | RoleDouble Double deriving (Ord, Eq, Show) ------------------------------------------------------------------------------ instance IsString RoleValue where fromString = RoleText . fromString ------------------------------------------------------------------------------ instance Hashable RoleValue where hashWithSalt salt (RoleBool e) = hashWithSalt salt e `hashWithSalt` (7 :: Int) hashWithSalt salt (RoleText t) = hashWithSalt salt t `hashWithSalt` (196613 :: Int) hashWithSalt salt (RoleInt i) = hashWithSalt salt i `hashWithSalt` (12582917 :: Int) hashWithSalt salt (RoleDouble d) = hashWithSalt salt d `hashWithSalt` (1610612741 :: Int) ------------------------------------------------------------------------------ data Role = Role { _roleName :: Text , _roleData :: HashMap Text RoleValue } deriving (Eq, Show) ------------------------------------------------------------------------------ instance IsString Role where fromString s = Role (fromString s) M.empty ------------------------------------------------------------------------------ toSortedList :: (Ord k, Ord v) => HashMap k v -> [(k,v)] toSortedList m = runST $ do v <- V.unsafeThaw $ V.fromList $ M.toList m VA.sort v v' <- V.unsafeFreeze v return $ V.toList v' ------------------------------------------------------------------------------ instance Hashable Role where hashWithSalt salt (Role nm dat) = h $ hashWithSalt salt nm where h s = hashWithSalt s $ toSortedList dat ------------------------------------------------------------------------------ data RoleValueMeta = RoleBoolMeta | RoleTextMeta | RoleEnumMeta [Text] | RoleIntMeta | RoleDoubleMeta ------------------------------------------------------------------------------ data RoleDataDefinition = RoleDataDefinition { _roleDataName :: Text , _roleValueMeta :: RoleValueMeta , _roleDataDescription :: Text } ------------------------------------------------------------------------------ data RoleMetadata = RoleMetadata { _roleMetadataName :: Text , _roleDescription :: Text , _roleDataDefs :: [RoleDataDefinition] }