1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

x.json2: support time.Time values in encode (#16643)

* feat: json2 time.Time encode

* refactor: best var name

* fix: use 'RFC 3339' as pattern in json encode

* fix: unused var for unaliased_typ

* fix: improve test

* use the clearer test after V ad24c22, that made format_rfc3339 more stable

Co-authored-by: Delyan Angelov <delian66@gmail.com>
This commit is contained in:
Hitalo Souza 2022-12-11 11:54:28 -03:00 committed by GitHub
parent ad24c22250
commit d7c244e5ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 59 additions and 2 deletions

View File

@ -107,11 +107,11 @@ fn test_bool() {
// valid conversions // valid conversions
assert sample_data['bool'] or { 0 }.bool() == false assert sample_data['bool'] or { 0 }.bool() == false
assert json.Any('true').bool() == true assert json.Any('true').bool() == true
// invalid conversions
assert sample_data['int'] or { 0 }.bool() == true assert sample_data['int'] or { 0 }.bool() == true
assert sample_data['i64'] or { 0 }.bool() == true assert sample_data['i64'] or { 0 }.bool() == true
assert sample_data['f32'] or { 0 }.bool() == true assert sample_data['f32'] or { 0 }.bool() == true
assert sample_data['f64'] or { 0 }.bool() == true assert sample_data['f64'] or { 0 }.bool() == true
// invalid conversions
assert sample_data['null'] or { 0 }.bool() == false assert sample_data['null'] or { 0 }.bool() == false
assert sample_data['arr'] or { 0 }.bool() == false assert sample_data['arr'] or { 0 }.bool() == false
assert sample_data['obj'] or { 0 }.bool() == false assert sample_data['obj'] or { 0 }.bool() == false

View File

@ -1,4 +1,15 @@
import x.json2 as json import x.json2 as json
import time
const fixed_time = time.Time{
year: 2022
month: 3
day: 11
hour: 13
minute: 54
second: 25
unix: 0
}
type StringAlias = string type StringAlias = string
type BoolAlias = bool type BoolAlias = bool
@ -6,6 +17,15 @@ type IntAlias = int
type SumTypes = bool | int | string type SumTypes = bool | int | string
enum Enumerates {
a
b
c
d
e = 99
f
}
struct StructType[T] { struct StructType[T] {
mut: mut:
val T val T

View File

@ -1,4 +1,15 @@
import x.json2 as json import x.json2 as json
import time
const fixed_time = time.Time{
year: 2022
month: 3
day: 11
hour: 13
minute: 54
second: 25
unix: 1647017665
}
type StringAlias = string type StringAlias = string
type BoolAlias = bool type BoolAlias = bool
@ -6,6 +17,15 @@ type IntAlias = int
type SumTypes = bool | int | string type SumTypes = bool | int | string
enum Enumerates {
a
b
c
d
e = 99
f
}
struct StructType[T] { struct StructType[T] {
mut: mut:
val T val T
@ -33,6 +53,9 @@ fn test_types() {
assert json.encode(StructType[int]{}) == '{"val":0}' assert json.encode(StructType[int]{}) == '{"val":0}'
assert json.encode(StructType[int]{ val: 0 }) == '{"val":0}' assert json.encode(StructType[int]{ val: 0 }) == '{"val":0}'
assert json.encode(StructType[int]{ val: 1 }) == '{"val":1}' assert json.encode(StructType[int]{ val: 1 }) == '{"val":1}'
assert json.encode(StructType[time.Time]{}) == '{"val":"0000-00-00T00:00:00.000Z"}'
assert json.encode(StructType[time.Time]{ val: fixed_time }) == '{"val":"2022-03-11T13:54:25.000Z"}'
} }
fn test_optional_types() { fn test_optional_types() {
@ -50,6 +73,9 @@ fn test_optional_types() {
assert json.encode(StructTypeOptional[int]{}) == '{"val":0}' assert json.encode(StructTypeOptional[int]{}) == '{"val":0}'
assert json.encode(StructTypeOptional[int]{ val: 0 }) == '{"val":0}' assert json.encode(StructTypeOptional[int]{ val: 0 }) == '{"val":0}'
assert json.encode(StructTypeOptional[int]{ val: 1 }) == '{"val":1}' assert json.encode(StructTypeOptional[int]{ val: 1 }) == '{"val":1}'
assert json.encode(StructTypeOptional[time.Time]{}) == '{"val":"0000-00-00T00:00:00.000Z"}'
assert json.encode(StructTypeOptional[time.Time]{ val: fixed_time }) == '{"val":"2022-03-11T13:54:25.000Z"}'
} }
fn test_array() { fn test_array() {

View File

@ -5,6 +5,7 @@ module json2
import io import io
import strings import strings
import time
// Encoder encodes the an `Any` type into JSON representation. // Encoder encodes the an `Any` type into JSON representation.
// It provides parameters in order to change the end result. // It provides parameters in order to change the end result.
@ -112,6 +113,7 @@ fn (e &Encoder) encode_any(val Any, level int, mut wr io.Writer) ! {
e.encode_newline(level - 1, mut wr)! e.encode_newline(level - 1, mut wr)!
wr.write([u8(`]`)])! wr.write([u8(`]`)])!
} }
time.Time {}
Null { Null {
wr.write(json2.null_in_bytes)! wr.write(json2.null_in_bytes)!
} }
@ -176,6 +178,9 @@ fn (e &Encoder) encode_struct[U](val U, level int, mut wr io.Writer) ! {
} }
$if field.typ is string { $if field.typ is string {
e.encode_string(value.str(), mut wr)! e.encode_string(value.str(), mut wr)!
} $else $if field.typ is time.Time {
parsed_time := val.$(field.name) as time.Time
e.encode_string(parsed_time.format_rfc3339(), mut wr)!
} $else $if field.typ is bool || field.typ is f32 || field.typ is f64 || field.typ is i8 } $else $if field.typ is bool || field.typ is f32 || field.typ is f64 || field.typ is i8
|| field.typ is i16 || field.typ is int || field.typ is i64 || field.typ is u8 || field.typ is i16 || field.typ is int || field.typ is i64 || field.typ is u8
|| field.typ is u16 || field.typ is u32 || field.typ is u64 { || field.typ is u16 || field.typ is u32 || field.typ is u64 {
@ -215,6 +220,10 @@ fn (e &Encoder) encode_struct[U](val U, level int, mut wr io.Writer) ! {
} $else $if field.typ is ?[]int { } $else $if field.typ is ?[]int {
optional_value := val.$(field.name) as ?[]int optional_value := val.$(field.name) as ?[]int
e.encode_array(optional_value, level, mut wr)! e.encode_array(optional_value, level, mut wr)!
} $else $if field.typ is ?time.Time {
optional_value := val.$(field.name) as ?time.Time
parsed_time := optional_value as time.Time
e.encode_string(parsed_time.format_rfc3339(), mut wr)!
} $else { } $else {
if field.unaliased_typ != field.typ { if field.unaliased_typ != field.typ {
match field.unaliased_typ { match field.unaliased_typ {

View File

@ -1,5 +1,4 @@
import x.json2 as json import x.json2 as json
import time
enum JobTitle { enum JobTitle {
manager manager

View File

@ -1,5 +1,7 @@
module json2 module json2
import time
// `Any` is a sum type that lists the possible types to be decoded and used. // `Any` is a sum type that lists the possible types to be decoded and used.
pub type Any = Null pub type Any = Null
| []Any | []Any
@ -12,6 +14,7 @@ pub type Any = Null
| int | int
| map[string]Any | map[string]Any
| string | string
| time.Time
| u16 | u16
| u32 | u32
| u64 | u64