@@ -167,7 +167,7 @@ fn parse_array_key(key string) (string, int) {
167167
168168// to_any converts the `Doc` to toml.Any type.
169169pub fn (d Doc) to_any () Any {
170- return d. ast_to_any (d.ast.table)
170+ return ast_to_any (d.ast.table)
171171}
172172
173173// value queries a value from the TOML document.
@@ -200,20 +200,20 @@ fn (d Doc) value_(value ast.Value, key []string) Any {
200200 }
201201
202202 if key.len < = 1 {
203- return d. ast_to_any (ast_value)
203+ return ast_to_any (ast_value)
204204 }
205205 match ast_value {
206206 map [string ]ast.Value, []ast.Value {
207207 return d.value_ (ast_value, key[1 ..])
208208 }
209209 else {
210- return d. ast_to_any (value)
210+ return ast_to_any (value)
211211 }
212212 }
213213}
214214
215215// ast_to_any converts `from` ast.Value to toml.Any value.
216- pub fn (d Doc) ast_to_any (value ast.Value) Any {
216+ pub fn ast_to_any (value ast.Value) Any {
217217 match value {
218218 ast.Date {
219219 return Any (Date{value.text})
@@ -228,11 +228,22 @@ pub fn (d Doc) ast_to_any(value ast.Value) Any {
228228 return Any (value.text)
229229 }
230230 ast.Number {
231- // if value.text.contains('inf') || value.text.contains('nan') {
232- // return Any() // TODO
233- // }
234- if ! value.text.starts_with ('0x' )
235- && (value.text.contains ('.' ) || value.text.to_lower ().contains ('e' )) {
231+ val_text := value.text
232+ if val_text == 'inf' || val_text == '+inf' || val_text == '-inf' {
233+ // NOTE values taken from strconv
234+ if ! val_text.starts_with ('-' ) {
235+ // strconv.double_plus_infinity
236+ return Any (u64 (0x7FF0000000000000 ))
237+ } else {
238+ // strconv.double_minus_infinity
239+ return Any (u64 (0xFFF0000000000000 ))
240+ }
241+ }
242+ if val_text == 'nan' || val_text == '+nan' || val_text == '-nan' {
243+ return Any ('nan' )
244+ }
245+ if ! val_text.starts_with ('0x' )
246+ && (val_text.contains ('.' ) || val_text.to_lower ().contains ('e' )) {
236247 return Any (value.f64 ())
237248 }
238249 return Any (value.i64 ())
@@ -248,7 +259,7 @@ pub fn (d Doc) ast_to_any(value ast.Value) Any {
248259 m := (value as map [string ]ast.Value)
249260 mut am := map [string ]Any{}
250261 for k, v in m {
251- am[k] = d. ast_to_any (v)
262+ am[k] = ast_to_any (v)
252263 }
253264 return am
254265 // return d.get_map_value(m, key_split[1..].join('.'))
@@ -257,7 +268,7 @@ pub fn (d Doc) ast_to_any(value ast.Value) Any {
257268 a := (value as []ast.Value)
258269 mut aa := []Any{}
259270 for val in a {
260- aa << d. ast_to_any (val)
271+ aa << ast_to_any (val)
261272 }
262273 return aa
263274 }
0 commit comments