0 | module Text.TOML.Types
2 | import public Data.Time.Time
3 | import public Data.SortedMap
4 | import Derive.Prelude
6 | import Text.ParseError
9 | %language ElabReflection
16 | data TomlFloat : Type where
18 | Infty : Maybe Sign -> TomlFloat
19 | Float : Double -> TomlFloat
21 | %runElab derive "TomlFloat" [Eq,Show]
24 | Interpolation TomlFloat where
25 | interpolate NaN = "nan"
26 | interpolate (Infty x) =
27 | let s = maybe "" interpolate x
29 | interpolate (Float dbl) = show dbl
36 | data TableType = None | Inline | Table
38 | %runElab derive "TableType" [Show,Eq,Ord]
41 | data ArrayType = Static | OfTables
43 | %runElab derive "ArrayType" [Show,Eq,Ord]
55 | data TomlValue : Type where
57 | TStr : String -> TomlValue
60 | TBool : Bool -> TomlValue
63 | TTime : AnyTime -> TomlValue
66 | TInt : Integer -> TomlValue
69 | TDbl : TomlFloat -> TomlValue
72 | TArr : ArrayType -> SnocList TomlValue -> TomlValue
75 | TTbl : TableType -> SortedMap String TomlValue -> TomlValue
77 | %runElab derive "TomlValue" [Eq,Show]
83 | TomlTable = SortedMap String TomlValue
90 | data KeyType = Plain | Quoted | Literal
92 | %runElab derive "KeyType" [Eq,Show]
95 | record KeyToken where
101 | %runElab derive "KeyToken" [Eq,Show]
104 | Interpolation KeyToken where
105 | interpolate (KT k t _) = case t of
108 | Literal => "'" ++ k ++ "'"
112 | data TomlToken : Type where
114 | TKey : List1 KeyToken -> TomlToken
117 | TVal : TomlValue -> TomlToken
120 | TSym : String -> TomlToken
129 | Comment : TomlToken
131 | %runElab derive "TomlToken" [Eq,Show]
133 | public export %inline
134 | key1 : KeyToken -> TomlToken
135 | key1 = TKey . singleton
138 | interpolateKey : List KeyToken -> String
139 | interpolateKey = concat . intersperse "." . map interpolate
142 | Interpolation TomlToken where
143 | interpolate NL = "<line break>"
144 | interpolate Space = "<space>"
145 | interpolate Comment = "<comment>"
146 | interpolate (TKey s) = interpolateKey $
forget s
147 | interpolate (TVal v) = case v of
148 | TStr str => "string literal"
149 | TBool x => toLower $
show x
151 | TTime i => interpolate i
152 | TDbl dbl => interpolate dbl
153 | TArr _ _ => "array"
154 | TTbl _ x => "table"
155 | interpolate (TSym c) = show c
162 | data TomlParseError : Type where
163 | ValueExists : List KeyToken -> TomlParseError
164 | InlineTableExists : List KeyToken -> TomlParseError
165 | TableExists : List KeyToken -> TomlParseError
166 | StaticArray : List KeyToken -> TomlParseError
167 | ExpectedKey : TomlParseError
169 | %runElab derive "TomlParseError" [Eq,Show]
172 | Interpolation TomlParseError where
173 | interpolate ExpectedKey = "Expected a key"
174 | interpolate (ValueExists k) =
175 | "Trying to overwrite existing value: \{interpolateKey k}"
176 | interpolate (InlineTableExists k) =
177 | "Trying to modify existing inline table: \{interpolateKey k}"
178 | interpolate (TableExists k) =
179 | "Trying to overwrite existing table: \{interpolateKey k}"
180 | interpolate (StaticArray k) =
181 | "Trying to modify a static array: \{interpolateKey k}"
186 | TomlErr = InnerError TomlParseError