toml: expand short date time milliseconds in decoder (#12564)
parent
6f46fc2170
commit
ff95cf18d4
|
@ -231,8 +231,9 @@ pub fn (t Time) str() string {
|
||||||
// DateTime is the data representation of a TOML date-time type (`YYYY-MM-DDTHH:MM:SS.milli`).
|
// DateTime is the data representation of a TOML date-time type (`YYYY-MM-DDTHH:MM:SS.milli`).
|
||||||
// DateTime types can appear only as values in TOML documents.
|
// DateTime types can appear only as values in TOML documents.
|
||||||
pub struct DateTime {
|
pub struct DateTime {
|
||||||
pub:
|
pub mut:
|
||||||
text string
|
text string
|
||||||
|
pub:
|
||||||
pos token.Position
|
pos token.Position
|
||||||
date Date
|
date Date
|
||||||
time Time
|
time Time
|
||||||
|
|
|
@ -34,6 +34,10 @@ fn (d Decoder) modify(mut value ast.Value) ? {
|
||||||
mut v := &(value as ast.Number)
|
mut v := &(value as ast.Number)
|
||||||
d.decode_number(mut v) ?
|
d.decode_number(mut v) ?
|
||||||
}
|
}
|
||||||
|
ast.DateTime {
|
||||||
|
mut v := &(value as ast.DateTime)
|
||||||
|
d.decode_date_time(mut v) ?
|
||||||
|
}
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -205,9 +209,10 @@ pub fn decode_quoted_escapes(mut q ast.Quoted) ? {
|
||||||
q.text = decoded_s
|
q.text = decoded_s
|
||||||
}
|
}
|
||||||
|
|
||||||
// decode_unicode_escape returns an error if `esc_unicode` is not
|
// decode_unicode_escape decodes the Unicode escape sequence `esc_unicode`.
|
||||||
// a valid Unicode escape sequence. `esc_unicode` is expected to be
|
// The sequence is expected to be prefixed with either `u` or `U`.
|
||||||
// prefixed with either `u` or `U`.
|
// decode_unicode_escape returns the decoded rune as
|
||||||
|
// a string, it's integer value and it's length.
|
||||||
fn decode_unicode_escape(esc_unicode string) ?(string, int, int) {
|
fn decode_unicode_escape(esc_unicode string) ?(string, int, int) {
|
||||||
is_long_esc_type := esc_unicode.starts_with('U')
|
is_long_esc_type := esc_unicode.starts_with('U')
|
||||||
mut sequence := esc_unicode[1..]
|
mut sequence := esc_unicode[1..]
|
||||||
|
@ -224,3 +229,30 @@ fn decode_unicode_escape(esc_unicode string) ?(string, int, int) {
|
||||||
rn := rune(i64_val)
|
rn := rune(i64_val)
|
||||||
return '$rn', int(i64_val), sequence_len
|
return '$rn', int(i64_val), sequence_len
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// decode_date_time decodes the `dt ast.DateTime`.
|
||||||
|
fn (d Decoder) decode_date_time(mut dt ast.DateTime) ? {
|
||||||
|
// Expand milliseconds that are only 1 char
|
||||||
|
if dt.text.contains('.') {
|
||||||
|
yymmddhhmmss := dt.text.all_before('.')
|
||||||
|
rest := dt.text.all_after('.')
|
||||||
|
z := if rest.contains('Z') { 'Z' } else { '' }
|
||||||
|
mut ms := rest
|
||||||
|
mut offset := ''
|
||||||
|
if rest.contains('+') {
|
||||||
|
offset = '+' + rest.all_after('+')
|
||||||
|
ms = rest.all_before('+')
|
||||||
|
} else if rest.contains('-') {
|
||||||
|
offset = '-' + rest.all_after('-')
|
||||||
|
ms = rest.all_before('-')
|
||||||
|
}
|
||||||
|
if z != '' {
|
||||||
|
ms = ms.replace('Z', '')
|
||||||
|
}
|
||||||
|
if ms.len > 1 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ms = ms + '0'.repeat(6 - ms.len) + z
|
||||||
|
dt.text = yymmddhhmmss + '.' + ms + offset
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -17,8 +17,6 @@ const (
|
||||||
valid_value_exceptions = [
|
valid_value_exceptions = [
|
||||||
// Integer
|
// Integer
|
||||||
'integer/long.toml', // TODO awaits BUG fix with strconv.parse_int('-9223372036854775808')
|
'integer/long.toml', // TODO awaits BUG fix with strconv.parse_int('-9223372036854775808')
|
||||||
// Date-time
|
|
||||||
'datetime/milliseconds.toml',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
jq = os.find_abs_path_of_executable('jq') or { '' }
|
jq = os.find_abs_path_of_executable('jq') or { '' }
|
||||||
|
|
Loading…
Reference in New Issue