From 5e74bb91ea00331f7afb9fc33c84f94bb8113a4a Mon Sep 17 00:00:00 2001 From: Thomas Pelletier Date: Fri, 25 Oct 2019 14:28:32 -0400 Subject: [PATCH] Local time support (#318) --- marshal.go | 3 +- marshal_test.go | 110 ++++++++++++++++++++++++++++++++++++++++++++-- tomltree_write.go | 2 + 3 files changed, 110 insertions(+), 5 deletions(-) diff --git a/marshal.go b/marshal.go index 1c181f3..2a6cfba 100644 --- a/marshal.go +++ b/marshal.go @@ -69,6 +69,7 @@ const ( var timeType = reflect.TypeOf(time.Time{}) var marshalerType = reflect.TypeOf(new(Marshaler)).Elem() var localDateType = reflect.TypeOf(LocalDate{}) +var localTimeType = reflect.TypeOf(LocalTime{}) var localDateTimeType = reflect.TypeOf(LocalDateTime{}) // Check if the given marshal type maps to a Tree primitive @@ -87,7 +88,7 @@ func isPrimitive(mtype reflect.Type) bool { case reflect.String: return true case reflect.Struct: - return mtype == timeType || mtype == localDateType || mtype == localDateTimeType || isCustomMarshaler(mtype) + return mtype == timeType || mtype == localDateType || mtype == localDateTimeType || mtype == localTimeType || isCustomMarshaler(mtype) default: return false } diff --git a/marshal_test.go b/marshal_test.go index dae6fb7..17a1418 100644 --- a/marshal_test.go +++ b/marshal_test.go @@ -1959,16 +1959,16 @@ func TestUnmarshalLocalDateTime(t *testing.T) { t.Errorf("expected day %d, got %d", example.out.Date.Day, obj.Date.Day()) } if obj.Date.Hour() != example.out.Time.Hour { - t.Errorf("expected day %d, got %d", example.out.Time.Hour, obj.Date.Hour()) + t.Errorf("expected hour %d, got %d", example.out.Time.Hour, obj.Date.Hour()) } if obj.Date.Minute() != example.out.Time.Minute { - t.Errorf("expected day %d, got %d", example.out.Time.Minute, obj.Date.Minute()) + t.Errorf("expected minute %d, got %d", example.out.Time.Minute, obj.Date.Minute()) } if obj.Date.Second() != example.out.Time.Second { - t.Errorf("expected day %d, got %d", example.out.Time.Second, obj.Date.Second()) + t.Errorf("expected second %d, got %d", example.out.Time.Second, obj.Date.Second()) } if obj.Date.Nanosecond() != example.out.Time.Nanosecond { - t.Errorf("expected day %d, got %d", example.out.Time.Nanosecond, obj.Date.Nanosecond()) + t.Errorf("expected nanoseconds %d, got %d", example.out.Time.Nanosecond, obj.Date.Nanosecond()) } }) } @@ -2038,3 +2038,105 @@ func TestMarshalLocalDateTime(t *testing.T) { }) } } + +func TestUnmarshalLocalTime(t *testing.T) { + examples := []struct { + name string + in string + out LocalTime + }{ + { + name: "normal", + in: "07:32:00", + out: LocalTime{ + Hour: 7, + Minute: 32, + Second: 0, + Nanosecond: 0, + }, + }, + { + name: "with nanoseconds", + in: "00:32:00.999999", + out: LocalTime{ + Hour: 0, + Minute: 32, + Second: 0, + Nanosecond: 999999000, + }, + }, + } + + for i, example := range examples { + toml := fmt.Sprintf(`Time = %s`, example.in) + + t.Run(fmt.Sprintf("ToLocalTime_%d_%s", i, example.name), func(t *testing.T) { + type dateStruct struct { + Time LocalTime + } + + var obj dateStruct + + err := Unmarshal([]byte(toml), &obj) + + if err != nil { + t.Fatal(err) + } + + if obj.Time != example.out { + t.Errorf("expected '%s', got '%s'", example.out, obj.Time) + } + }) + } +} + +func TestMarshalLocalTime(t *testing.T) { + type timeStruct struct { + Time LocalTime + } + + examples := []struct { + name string + in LocalTime + out string + }{ + { + name: "normal", + out: "Time = 07:32:00\n", + in: LocalTime{ + Hour: 7, + Minute: 32, + Second: 0, + Nanosecond: 0, + }}, + { + name: "with nanoseconds", + out: "Time = 00:32:00.999999000\n", + in: LocalTime{ + Hour: 0, + Minute: 32, + Second: 0, + Nanosecond: 999999000, + }, + }, + } + + for i, example := range examples { + t.Run(fmt.Sprintf("%d_%s", i, example.name), func(t *testing.T) { + obj := timeStruct{ + Time: example.in, + } + b, err := Marshal(obj) + + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + got := string(b) + + if got != example.out { + t.Errorf("expected '%s', got '%s'", example.out, got) + } + }) + } +} diff --git a/tomltree_write.go b/tomltree_write.go index a065650..43c6303 100644 --- a/tomltree_write.go +++ b/tomltree_write.go @@ -140,6 +140,8 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen return value.String(), nil case LocalDateTime: return value.String(), nil + case LocalTime: + return value.String(), nil case nil: return "", nil }