-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathTomladris.idr
103 lines (77 loc) · 3.47 KB
/
Tomladris.idr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
module Tomladris
import public Data.String
import public Data.SortedMap
import public Lightyear
import public Lightyear.Char
import public Lightyear.Strings
data TomlValue = TComment String
| TString String
| TInteger Integer
| TDouble Double
| TBoolean Bool
| TArray (List TomlValue)
| TTableKV TomlValue TomlValue
private
parseComment : Parser TomlValue
parseComment = TComment . pack <$> (char '#' *> many (noneOf "\n"))
parseNumber : Parser TomlValue
parseNumber = (parseNum . pack) <$> many (oneOf "1234567890.eE+-")
where
parseNum : String -> TomlValue
parseNum s = case parseInteger s of
(Just x) => TInteger x
Nothing => case parseDouble s of
(Just x) => TDouble x
Nothing => TDouble 0.0
parseTBoolean : Parser TomlValue
parseTBoolean = toBool <$> (string "true" <|> string "false")
where
toBool s = case s of
"true" => TBoolean True
"false" => TBoolean False
parseTString : Parser TomlValue
parseTString = (TString) <$> (quoted '\'' <|> quoted '\"')
--lazying '[' ']' match very very important
--else we get infinite loop
mutual
parseTArray : Parser TomlValue
parseTArray = TArray <$> (spaces *> (char '[') *>| parsePrimitives <*| (char ']'))
parsePrimitives : Parser (List TomlValue)
parsePrimitives = spaces *> (sepBy1 parseNumber (char ',')) <|>|
(sepBy1 parseTBoolean (char ',')) <|>|
(sepBy1 parseTString (char ',')) <|>|
(sepBy1 parseTArray (char ','))
parseTableName : Parser TomlValue
parseTableName = (TString .pack) <$> ((many endOfLine) *> spaces *> (char '[') *>| (many (noneOf "]")) <*| (char ']'))
parseTKeyVal : Parser TomlValue
parseTKeyVal = (TTableKV) <$>
(parseTString <|> parseString) <*>
(char '=' *>
spaces *> (parseTString <|>
parseTArray <|>
parseTBoolean <|>
parseNumber))
where
parseString = (TString . pack) <$>
(((many endOfLine) *> spaces *> many (noneOf " [=")) <|>
(spaces *> many (noneOf " [=")))
keyMap : (List TomlValue) -> SortedMap String TomlValue
keyMap [] = empty
keyMap (x::xs) = keyMapAux x xs empty
where
keyMapAux : TomlValue -> (List TomlValue) -> SortedMap String TomlValue -> SortedMap String TomlValue
keyMapAux root [] m = m
keyMapAux root@(TString r) ((TTableKV (TString key) value)::xs) m = keyMapAux root xs (insert (r ++ "." ++ key) value m)
addKeyVal : String -> String -> TomlValue -> SortedMap String TomlValue -> SortedMap String TomlValue
addKeyVal root key value m = if (length root == 0)
then insert key value m
else insert (root ++ "." ++ key) value m
foldOver : String -> (List TomlValue) -> SortedMap String TomlValue -> SortedMap String TomlValue
foldOver root [] m = m
foldOver root ((TString table)::xs) m = foldOver table xs m
foldOver root ((TTableKV (TString key) value)::xs) m = foldOver root xs (addKeyVal root key value m)
public
parseToml : String -> SortedMap String TomlValue
parseToml s = case parse (many (parseTableName <|> parseTKeyVal)) s of
(Right lstToml) => foldOver "" lstToml empty
(Left _) => empty