Initial project import
This commit is contained in:
commit
23f2d29e32
11957 files changed
+1754577
No files matched your search
@@ -0,0 +1,139 @@
|
||||
module yaml
|
||||
|
||||
import time
|
||||
import x.json2
|
||||
|
||||
fn (a Any) value_(current Any, key []string) ?Any {
|
||||
if key.len == 0 {
|
||||
return none
|
||||
}
|
||||
k, index := parse_array_key(key[0])
|
||||
value := match current {
|
||||
[]Any {
|
||||
if k != '' {
|
||||
return none
|
||||
}
|
||||
current[index] or { return none }
|
||||
}
|
||||
map[string]Any {
|
||||
v := current[k] or { return none }
|
||||
if index > -1 {
|
||||
if v is []Any {
|
||||
v[index] or { return none }
|
||||
} else {
|
||||
return none
|
||||
}
|
||||
} else {
|
||||
v
|
||||
}
|
||||
}
|
||||
else {
|
||||
return none
|
||||
}
|
||||
}
|
||||
|
||||
if key.len <= 1 {
|
||||
return value
|
||||
}
|
||||
return match value {
|
||||
[]Any, map[string]Any { a.value_(value, key[1..]) }
|
||||
else { none }
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_dotted_key(key string) ![]string {
|
||||
mut out := []string{}
|
||||
mut buf := ''
|
||||
mut in_string := false
|
||||
mut delimiter := u8(` `)
|
||||
for ch in key {
|
||||
if ch in [`"`, `'`] {
|
||||
if !in_string {
|
||||
delimiter = ch
|
||||
in_string = true
|
||||
continue
|
||||
}
|
||||
if ch == delimiter {
|
||||
in_string = false
|
||||
if buf != '' {
|
||||
out << buf
|
||||
}
|
||||
buf = ''
|
||||
delimiter = ` `
|
||||
continue
|
||||
}
|
||||
}
|
||||
buf += ch.ascii_str()
|
||||
if !in_string && ch == `.` {
|
||||
buf = buf[..buf.len - 1]
|
||||
if buf != '' {
|
||||
out << buf
|
||||
}
|
||||
buf = ''
|
||||
}
|
||||
}
|
||||
if buf != '' {
|
||||
out << buf
|
||||
}
|
||||
if in_string {
|
||||
return error('yaml: missing closing string delimiter `${delimiter.ascii_str()}`')
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
fn parse_array_key(key string) (string, int) {
|
||||
mut index := -1
|
||||
mut k := key
|
||||
if k.contains('[') {
|
||||
index = k.all_after('[').all_before(']').int()
|
||||
if k.starts_with('[') {
|
||||
k = ''
|
||||
} else {
|
||||
k = k.all_before('[')
|
||||
}
|
||||
}
|
||||
return k, index
|
||||
}
|
||||
|
||||
fn from_json2(value json2.Any) Any {
|
||||
return match value {
|
||||
[]json2.Any {
|
||||
mut arr := []Any{cap: value.len}
|
||||
for item in value {
|
||||
arr << from_json2(item)
|
||||
}
|
||||
Any(arr)
|
||||
}
|
||||
map[string]json2.Any {
|
||||
mut out := map[string]Any{}
|
||||
for key, item in value {
|
||||
out[key] = from_json2(item)
|
||||
}
|
||||
Any(out)
|
||||
}
|
||||
bool {
|
||||
Any(value)
|
||||
}
|
||||
f32, f64 {
|
||||
Any(f64(value))
|
||||
}
|
||||
i8, i16, i32, int {
|
||||
Any(int(value))
|
||||
}
|
||||
i64 {
|
||||
Any(value)
|
||||
}
|
||||
u8, u16, u32, u64 {
|
||||
Any(u64(value))
|
||||
}
|
||||
string {
|
||||
Any(value)
|
||||
}
|
||||
time.Time {
|
||||
Any(value.str())
|
||||
}
|
||||
json2.Null {
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user