99--
1010-- change file mode bits.
1111
12+ -- XXX Rename to "Permissions" or "AccessControl"
13+
1214module Streamly.Coreutils.StringQ
1315 (
14- perm
15- , UserType (.. )
16+ Role (.. )
1617 , Permissions (.. )
17- , UserTypePerm (.. )
18+ , setReadable
19+ , setWritable
20+ , setExecutable
21+ , reset
1822 )
1923where
2024
@@ -31,9 +35,63 @@ import Streamly.Internal.Data.Parser (Parser)
3135import qualified Streamly.Internal.Data.Fold as Fold
3236import qualified Streamly.Internal.Data.Parser as Parser
3337import qualified Streamly.Internal.Data.Stream.IsStream as Stream
34- import qualified Streamly.Internal.Unicode.Char.Parser as Parser
38+ import qualified Streamly.Internal.Unicode.Parser as Parser
39+
40+ -------------------------------------------------------------------------------
41+ -- Permissions
42+ -------------------------------------------------------------------------------
43+
44+ -- | Permissions for access control
45+ data Permissions = Permissions
46+ { readable :: Bool
47+ , writable :: Bool
48+ , executable :: Bool
49+ -- , searchable :: Bool -- for portability, keep it separate
50+ } deriving (Eq , Ord , Read , Show , Data )
3551
36- strParser :: MonadCatch m => Parser m Char String
52+ {-
53+ defaultPermissions =
54+ Permissions
55+ { readable = False
56+ , writable = False
57+ , executable = False
58+ }
59+ -}
60+
61+ -- | Enable @read@ permission.
62+ setReadable :: Bool -> Permissions -> Permissions
63+ setReadable x perms = perms { readable = x }
64+
65+ -- | Enable @write@ permission.
66+ setWritable :: Bool -> Permissions -> Permissions
67+ setWritable x perms = perms { writable = x }
68+
69+ -- | Enable @execute@ permission.
70+ setExecutable :: Bool -> Permissions -> Permissions
71+ setExecutable x perms = perms { executable = x }
72+
73+ -- | Disable all permissions.
74+ reset :: Permissions -> Permissions
75+ reset = setReadable False . setWritable False . setExecutable False
76+
77+ -------------------------------------------------------------------------------
78+ -- Roles
79+ -------------------------------------------------------------------------------
80+
81+ -- | Roles to whom access is granted.
82+ data Role =
83+ Owner
84+ | Group
85+ | Others
86+ | All
87+ deriving (Eq , Ord , Read , Show , Data )
88+
89+ -------------------------------------------------------------------------------
90+ -- Mode parser
91+ -------------------------------------------------------------------------------
92+
93+ {-
94+ strParser :: MonadCatch m => Parser Char m String
3795strParser =
3896 let ut = Parser.char 'u'
3997 <|> Parser.char 'g'
@@ -57,33 +115,7 @@ expandVars ln =
57115 Left _ -> fail "Parsing of perm quoted string failed."
58116 Right _ -> return ()
59117
60- data Permissions = Permissions
61- { readable :: Bool
62- , writable :: Bool
63- , executable :: Bool
64- } deriving (Eq , Ord , Read , Show , Data )
65-
66- data UserType =
67- Owner
68- | Group
69- | Others
70- | All
71- deriving (Eq , Ord , Read , Show , Data )
72-
73- data UserTypePerm =
74- UserTypePerm
75- { utype :: UserType
76- , permssions :: Permissions
77- } deriving (Eq , Ord , Read , Show , Data )
78-
79- instance Default Permissions where
80- def = Permissions
81- { readable = False
82- , writable = False
83- , executable = False
84- }
85-
86- parseExpr :: MonadIO m => String -> m UserTypePerm
118+ parseExpr :: MonadIO m => String -> m [(Role, Permissions)]
87119parseExpr s = do
88120 liftIO $ expandVars s
89121 let ut = head s
@@ -119,15 +151,35 @@ quoteExprPat s = do
119151 expr <- parseExpr s
120152 dataToPatQ (const Nothing) expr
121153
122- perm :: QuasiQuoter
123- perm =
154+ -- TODO: perms can have a single letter from the set ugo, in that case the
155+ -- existing permissions are copied from that role.
156+
157+ -- When we get a "=" use 'reset', when we get a '+' use an operation with
158+ -- argument True, else use False.
159+
160+ -- | The format of a symbolic mode is [roles][-+=][perms...], where roles is
161+ -- either zero or more letters from the set ugoa. perms is either zero or more
162+ -- letters from the set rwxXst. Multiple symbolic modes can be given, separated
163+ -- by commas.
164+ --
165+ -- Examples:
166+ --
167+ -- @
168+ -- -
169+ -- -rwx
170+ -- g-rx
171+ -- g-x+r
172+ -- go-x+rw
173+ -- go-x+rw,u+r
174+ -- @
175+ --
176+ -- If the role is omitted it is assumed to be 'a'.
177+ mode :: QuasiQuoter
178+ mode =
124179 QuasiQuoter
125180 { quoteExp = quoteExprExp
126181 , quotePat = quoteExprPat
127- , quoteType = notSupported
128- , quoteDec = notSupported
182+ , quoteType = error "mode: quoteType not supported."
183+ , quoteDec = error "mode: quoteDec not supported."
129184 }
130-
131- where
132-
133- notSupported = error " perm: Not supported."
185+ -}
0 commit comments