138 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			V
		
	
	
| // Copyright (c) 2021 Lars Pontoppidan. All rights reserved.
 | |
| // Use of this source code is governed by an MIT license
 | |
| // that can be found in the LICENSE file.
 | |
| module to
 | |
| 
 | |
| import toml
 | |
| import x.json2
 | |
| 
 | |
| type DocOrAny = toml.Any | toml.Doc
 | |
| 
 | |
| // json returns `doa` as a JSON encoded string.
 | |
| pub fn json(doa DocOrAny) string {
 | |
| 	match doa {
 | |
| 		toml.Doc {
 | |
| 			return any_to_json(toml.ast_to_any(doa.ast.table))
 | |
| 		}
 | |
| 		toml.Any {
 | |
| 			return any_to_json(doa)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // json returns `a` as a JSON encoded string.
 | |
| fn any_to_json(a toml.Any) string {
 | |
| 	match a {
 | |
| 		toml.Null {
 | |
| 			return 'null'
 | |
| 		}
 | |
| 		toml.DateTime {
 | |
| 			json_text := json2.Any(a.str())
 | |
| 			return '"$json_text.json_str()"'
 | |
| 		}
 | |
| 		toml.Date {
 | |
| 			json_text := json2.Any(a.str())
 | |
| 			return '"$json_text.json_str()"'
 | |
| 		}
 | |
| 		toml.Time {
 | |
| 			json_text := json2.Any(a.str())
 | |
| 			return '"$json_text.json_str()"'
 | |
| 		}
 | |
| 		string {
 | |
| 			return '"' + json2.Any(a.str()).json_str() + '"'
 | |
| 		}
 | |
| 		bool {
 | |
| 			return json2.Any(bool(a)).json_str()
 | |
| 		}
 | |
| 		f32 {
 | |
| 			return json2.Any(f32(a)).json_str()
 | |
| 		}
 | |
| 		f64 {
 | |
| 			return json2.Any(f64(a)).json_str()
 | |
| 		}
 | |
| 		i64 {
 | |
| 			return json2.Any(i64(a)).json_str()
 | |
| 		}
 | |
| 		int {
 | |
| 			return json2.Any(int(a)).json_str()
 | |
| 		}
 | |
| 		u64 {
 | |
| 			return json2.Any(u64(a)).json_str()
 | |
| 		}
 | |
| 		map[string]toml.Any {
 | |
| 			mut str := '{'
 | |
| 			for key, val in a {
 | |
| 				json_key := json2.Any(key)
 | |
| 				str += ' "$json_key.json_str()": ${any_to_json(val)},'
 | |
| 			}
 | |
| 			str = str.trim_right(',')
 | |
| 			str += ' }'
 | |
| 			return str
 | |
| 		}
 | |
| 		[]toml.Any {
 | |
| 			mut str := '['
 | |
| 			for val in a {
 | |
| 				str += ' ${any_to_json(val)},'
 | |
| 			}
 | |
| 			str = str.trim_right(',')
 | |
| 			str += ' ]'
 | |
| 			return str
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // json_any returns `Any` as a `x.json2.Any` type.
 | |
| pub fn json_any(a toml.Any) json2.Any {
 | |
| 	match a {
 | |
| 		toml.Null {
 | |
| 			return json2.Null{}
 | |
| 		}
 | |
| 		toml.DateTime {
 | |
| 			return json2.Any(a.str())
 | |
| 		}
 | |
| 		toml.Date {
 | |
| 			return json2.Any(a.str())
 | |
| 		}
 | |
| 		toml.Time {
 | |
| 			return json2.Any(a.str())
 | |
| 		}
 | |
| 		string {
 | |
| 			return json2.Any(a.str())
 | |
| 		}
 | |
| 		bool {
 | |
| 			return json2.Any(bool(a))
 | |
| 		}
 | |
| 		int {
 | |
| 			return json2.Any(int(a))
 | |
| 		}
 | |
| 		f32 {
 | |
| 			return json2.Any(f32(a))
 | |
| 		}
 | |
| 		f64 {
 | |
| 			return json2.Any(f64(a))
 | |
| 		}
 | |
| 		i64 {
 | |
| 			return json2.Any(i64(a))
 | |
| 		}
 | |
| 		u64 {
 | |
| 			return json2.Any(u64(a))
 | |
| 		}
 | |
| 		map[string]toml.Any {
 | |
| 			mut jmap := map[string]json2.Any{}
 | |
| 			for key, val in a {
 | |
| 				jmap[key] = json_any(val)
 | |
| 			}
 | |
| 			return jmap
 | |
| 		}
 | |
| 		[]toml.Any {
 | |
| 			mut jarr := []json2.Any{}
 | |
| 
 | |
| 			for val in a {
 | |
| 				jarr << json_any(val)
 | |
| 			}
 | |
| 
 | |
| 			return jarr
 | |
| 		}
 | |
| 	}
 | |
| }
 |