11module 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
820import 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-
7281stringInner ∷ ∀ m . Monad m ⇒ P.ParserT String m String
7382stringInner = 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`.
95106parseTime ∷ ∀ m . Monad m ⇒ P.ParserT String m DT.Time
96107parseTime = 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`.
107120parseDate ∷ ∀ m . Monad m ⇒ P.ParserT String m DT.Date
108121parseDate = 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`.
119135parseTimestamp ∷ ∀ m . Monad m ⇒ P.ParserT String m DT.DateTime
120136parseTimestamp = 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-
148151parseDigit ∷ ∀ m . Monad m ⇒ P.ParserT String m Int
149152parseDigit =
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-
233229parseExponent
234230 ∷ ∀ m
235231 . Monad m
236232 ⇒ P.ParserT String m Int
237233parseExponent =
238234 (PS .string " e" <|> PS .string " E" )
239- *> parseInt
235+ *> parseIntLiteral
240236
241237parsePositiveScientific
242238 ∷ ∀ m
@@ -278,13 +274,50 @@ parseScientific
278274parseScientific =
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.
290323parseEJsonF
@@ -295,28 +328,15 @@ parseEJsonF
295328parseEJsonF 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