Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit df1e9b3

Browse files
committed
Export parsers for literals and values
1 parent 408c57c commit df1e9b3

File tree

1 file changed

+76
-56
lines changed

1 file changed

+76
-56
lines changed

src/Data/Json/Extended/Signature/Parse.purs

Lines changed: 76 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
11
module Data.Json.Extended.Signature.Parse
22
( parseEJsonF
3+
, parseNull
4+
, parseBooleanLiteral
5+
, parseDecimalLiteral
6+
, parseIntLiteral
7+
, parseStringLiteral
8+
, parseTimestampLiteral
39
, parseTimestamp
4-
, parseDate
10+
, parseTimeLiteral
511
, parseTime
12+
, parseDateLiteral
13+
, parseDate
14+
, parseIntervalLiteral
15+
, parseObjectIdLiteral
16+
, parseArrayLiteral
17+
, parseMapLiteral
618
) where
719

820
import Prelude
@@ -66,9 +78,6 @@ commaSep =
6678
*> PS.string ","
6779
<* PS.skipSpaces
6880

69-
stringLiteral m. Monad m P.ParserT String m String
70-
stringLiteral = quoted stringInner
71-
7281
stringInner m . Monad m P.ParserT String m String
7382
stringInner = A.many stringChar <#> S.fromCharArray
7483
where
@@ -92,6 +101,8 @@ taggedLiteral tag p =
92101
PS.string tag
93102
*> parens (quoted p)
94103

104+
-- | Parses time _values_ of the form `HH:mm:SS`. For the EJson time literal
105+
-- | `TIME("HH:mm:SS")` use `parseTimeLiteral`.
95106
parseTime m. Monad m P.ParserT String m DT.Time
96107
parseTime = do
97108
hour ← parse10
@@ -104,6 +115,8 @@ parseTime = do
104115
M.Nothing
105116
P.fail $ "Invalid time value " <> show hour <> ":" <> show minute <> ":" <> show second
106117

118+
-- | Parses date _values_ of the form `YYYY-MM-DD`. For the EJson date literal
119+
-- | `DATE("YYYY-MM-DD")` use `parseDateLiteral`.
107120
parseDate m. Monad m P.ParserT String m DT.Date
108121
parseDate = do
109122
year ← parse1000
@@ -116,6 +129,9 @@ parseDate = do
116129
M.Nothing
117130
P.fail $ "Invalid date value " <> show year <> "-" <> show month <> "-" <> show day
118131

132+
-- | Parses timestamp _values_ of the form `YYYY-MM-DDTHH:mm:SSZ`. For the
133+
-- | EJson timestamp literal `TIMESTAMP("YYYY-MM-DDTHH:mm:SSZ")` use
134+
-- | `parseTimestampLiteral`.
119135
parseTimestamp m. Monad m P.ParserT String m DT.DateTime
120136
parseTimestamp = do
121137
d ← parseDate
@@ -132,19 +148,6 @@ anyString =
132148
A.many PS.anyChar
133149
<#> S.fromCharArray
134150

135-
parseNull m. Monad m P.ParserT String m Unit
136-
parseNull = PS.string "null" $> unit
137-
138-
parseBoolean
139-
m
140-
. Monad m
141-
P.ParserT String m Boolean
142-
parseBoolean =
143-
PC.choice
144-
[ true <$ PS.string "true"
145-
, false <$ PS.string "false"
146-
]
147-
148151
parseDigit m. Monad m P.ParserT String m Int
149152
parseDigit =
150153
PC.choice
@@ -223,20 +226,13 @@ parseSigned p =
223226
parseNegative p
224227
<|> parsePositive p
225228

226-
parseInt
227-
m
228-
. Monad m
229-
P.ParserT String m Int
230-
parseInt =
231-
parseSigned parseNat
232-
233229
parseExponent
234230
m
235231
. Monad m
236232
P.ParserT String m Int
237233
parseExponent =
238234
(PS.string "e" <|> PS.string "E")
239-
*> parseInt
235+
*> parseIntLiteral
240236

241237
parsePositiveScientific
242238
m
@@ -278,13 +274,50 @@ parseScientific
278274
parseScientific =
279275
parseSigned parsePositiveScientific
280276

281-
parseDecimal
282-
m
283-
. Monad m
284-
P.ParserT String m HN.HugeNum
285-
parseDecimal =
286-
parseHugeNum
287-
<|> parseScientific
277+
parseNull m. Monad m P.ParserT String m Unit
278+
parseNull = PS.string "null" $> unit
279+
280+
parseBooleanLiteral m. Monad m P.ParserT String m Boolean
281+
parseBooleanLiteral =
282+
PC.choice
283+
[ true <$ PS.string "true"
284+
, false <$ PS.string "false"
285+
]
286+
287+
parseDecimalLiteral m. Monad m P.ParserT String m HN.HugeNum
288+
parseDecimalLiteral = parseHugeNum <|> parseScientific
289+
290+
parseIntLiteral m. Monad m P.ParserT String m Int
291+
parseIntLiteral = parseSigned parseNat
292+
293+
parseStringLiteral m. Monad m P.ParserT String m String
294+
parseStringLiteral = quoted stringInner
295+
296+
parseTimestampLiteral :: forall m. Monad m => P.ParserT String m DT.DateTime
297+
parseTimestampLiteral = taggedLiteral "TIMESTAMP" parseTimestamp
298+
299+
parseTimeLiteral :: forall m. Monad m => P.ParserT String m DT.Time
300+
parseTimeLiteral = taggedLiteral "TIME" parseTime
301+
302+
parseDateLiteral :: forall m. Monad m => P.ParserT String m DT.Date
303+
parseDateLiteral = taggedLiteral "DATE" parseDate
304+
305+
parseIntervalLiteral :: forall m. Monad m => P.ParserT String m String
306+
parseIntervalLiteral = taggedLiteral "INTERVAL" stringInner
307+
308+
parseObjectIdLiteral :: forall m. Monad m => P.ParserT String m String
309+
parseObjectIdLiteral = taggedLiteral "OID" stringInner
310+
311+
parseArrayLiteral :: forall a m. Monad m => P.ParserT String m a -> P.ParserT String m (Array a)
312+
parseArrayLiteral p = A.fromFoldable <$> squares (commaSep p)
313+
314+
parseMapLiteral :: forall a m. Monad m => P.ParserT String m a -> P.ParserT String m (EJsonMap a)
315+
parseMapLiteral p = EJsonMap <<< A.fromFoldable <$> braces (commaSep parseAssignment)
316+
where
317+
parseColon P.ParserT String m String
318+
parseColon = PS.skipSpaces *> PS.string ":" <* PS.skipSpaces
319+
parseAssignment P.ParserT String m (T.Tuple a a)
320+
parseAssignment = T.Tuple <$> p <* parseColon <*> p
288321

289322
-- | Parse one layer of structure.
290323
parseEJsonF
@@ -295,28 +328,15 @@ parseEJsonF
295328
parseEJsonF rec =
296329
PC.choice $
297330
[ Null <$ parseNull
298-
, Boolean <$> parseBoolean
299-
, Decimal <$> PC.try parseDecimal
300-
, Integer <$> parseInt
301-
, String <$> stringLiteral
302-
, Timestamp <$> taggedLiteral "TIMESTAMP" parseTimestamp
303-
, Time <$> taggedLiteral "TIME" parseTime
304-
, Date <$> taggedLiteral "DATE" parseDate
305-
, Interval <$> taggedLiteral "INTERVAL" stringInner
306-
, ObjectId <$> taggedLiteral "OID" stringInner
307-
, Array <<< A.fromFoldable <$> squares (commaSep rec)
308-
, Map <<< EJsonMap <<< A.fromFoldable <$> braces (commaSep parseAssignment)
331+
, Boolean <$> parseBooleanLiteral
332+
, Decimal <$> PC.try parseDecimalLiteral
333+
, Integer <$> parseIntLiteral
334+
, String <$> parseStringLiteral
335+
, Timestamp <$> parseTimestampLiteral
336+
, Time <$> parseTimeLiteral
337+
, Date <$> parseDateLiteral
338+
, Interval <$> parseIntervalLiteral
339+
, ObjectId <$> parseObjectIdLiteral
340+
, Array <$> parseArrayLiteral rec
341+
, Map <$> parseMapLiteral rec
309342
]
310-
311-
where
312-
parseColon P.ParserT String m String
313-
parseColon =
314-
PS.skipSpaces
315-
*> PS.string ":"
316-
<* PS.skipSpaces
317-
318-
parseAssignment P.ParserT String m (T.Tuple a a)
319-
parseAssignment =
320-
T.Tuple
321-
<$> rec <* parseColon
322-
<*> rec

0 commit comments

Comments
 (0)