9
9
--
10
10
-- change file mode bits.
11
11
12
+ -- XXX Rename to "Permissions" or "AccessControl"
13
+
12
14
module Streamly.Coreutils.StringQ
13
15
(
14
- perm
15
- , UserType (.. )
16
+ Role (.. )
16
17
, Permissions (.. )
17
- , UserTypePerm (.. )
18
+ , setReadable
19
+ , setWritable
20
+ , setExecutable
21
+ , reset
18
22
)
19
23
where
20
24
@@ -31,9 +35,63 @@ import Streamly.Internal.Data.Parser (Parser)
31
35
import qualified Streamly.Internal.Data.Fold as Fold
32
36
import qualified Streamly.Internal.Data.Parser as Parser
33
37
import 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 )
35
51
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
37
95
strParser =
38
96
let ut = Parser.char 'u'
39
97
<|> Parser.char 'g'
@@ -57,33 +115,7 @@ expandVars ln =
57
115
Left _ -> fail "Parsing of perm quoted string failed."
58
116
Right _ -> return ()
59
117
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)]
87
119
parseExpr s = do
88
120
liftIO $ expandVars s
89
121
let ut = head s
@@ -119,15 +151,35 @@ quoteExprPat s = do
119
151
expr <- parseExpr s
120
152
dataToPatQ (const Nothing) expr
121
153
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 =
124
179
QuasiQuoter
125
180
{ quoteExp = quoteExprExp
126
181
, quotePat = quoteExprPat
127
- , quoteType = notSupported
128
- , quoteDec = notSupported
182
+ , quoteType = error "mode: quoteType not supported."
183
+ , quoteDec = error "mode: quoteDec not supported."
129
184
}
130
-
131
- where
132
-
133
- notSupported = error " perm: Not supported."
185
+ -}
0 commit comments