4 | module Language.TOML.Parser
6 | import Language.TOML.ConcreteSyntax
7 | import Language.TOML.Tokens
19 | fromEither : {c : _} -> Grammar state token c (Either String a) -> Grammar state token c a
20 | fromEither {c = False} act = do
22 | the (Grammar _ _ False a) $
25 | Left err => failLoc xb.bounds err
26 | fromEither {c = True} act = do
28 | the (Grammar _ _ False a) $
31 | Left err => failLoc xb.bounds err
34 | punct : Punctuation -> Grammar state TOMLToken True ()
35 | punct p = match $
TTPunct p
38 | maybeNewlines : Grammar state TOMLToken False ()
40 | _ <- many (punct NewLine)
44 | newlines : Grammar state TOMLToken False ()
45 | newlines = (some (punct NewLine) >>= \_ => pure ()) <|> eof
48 | allowNewlines : (p : Grammar state TOMLToken True a) -> Grammar state TOMLToken True a
49 | allowNewlines p = maybeNewlines *> p <* maybeNewlines
52 | string : Grammar state TOMLToken True CValue
53 | string = CVString <$> fromEither (terminal "string" getString)
56 | boolean : Grammar state TOMLToken True CValue
57 | boolean = map CVBoolean $
match TTBoolean
60 | integer : Grammar state TOMLToken True CValue
61 | integer = map CVInteger $
match TTInt
64 | float : Grammar state TOMLToken True CValue
65 | float = map CVFloat $
match TTFloat
68 | bare : Grammar state TOMLToken True String
72 | key : Grammar state TOMLToken True CKey
75 | rest <- many (punct Dot *> keyAtom)
77 | [] => pure $
CKAtom first
78 | rest => pure $
CKDotted (first:::rest)
80 | keyAtom : Grammar state TOMLToken True CKeyAtom
81 | keyAtom = map CKBare bare
82 | <|> (map CKQuoted $
fromEither $
terminal "string key" getKeyString)
86 | value : Grammar state TOMLToken True CValue
95 | array : Grammar state TOMLToken True CValue
99 | vals <- sepBy (allowNewlines $
punct Comma) (allowNewlines value)
100 | punct (Square Close)
101 | pure $
CVArray vals
104 | inlineTable : Grammar state TOMLToken True CValue
108 | vals <- sepBy (punct Comma) $
do
114 | punct (Curly Close)
115 | pure $
CVInlineTable vals
118 | keyValue : Grammar state TOMLToken True Item
124 | pure $
IKeyValue k v
127 | tableHeader : Grammar state TOMLToken True Item
129 | punct (Square Open)
132 | punct (Square Close)
134 | pure $
ITableHeader k
137 | tableArrayHeader : Grammar state TOMLToken True Item
138 | tableArrayHeader = do
139 | punct (Square Open)
140 | punct (Square Open)
143 | punct (Square Close)
144 | punct (Square Close)
146 | pure $
ITableArray k
149 | item : Grammar state TOMLToken True Item
152 | <|> tableArrayHeader
155 | items : Grammar state TOMLToken False (List Item)
164 | parseItems : List (WithBounds TOMLToken) -> Either (List String) (List Item)
165 | parseItems toks = case parse items $
filter (not . ignored) toks of
166 | Right (its, []) => Right its
167 | Right _ => Left ["unconsumed input"]
168 | Left errs => Left . flip map (forget errs) $
\(Error msg bounds) =>
171 | "\{show bounds.startLine}:\{show bounds.startCol}--\{show bounds.endLine}:\{show bounds.endCol}: \{msg}"