diff --git a/range.go b/range.go index 77b6f82..2b73e41 100644 --- a/range.go +++ b/range.go @@ -3,6 +3,7 @@ package trn import ( + "encoding/json" "fmt" "strconv" "strings" @@ -51,6 +52,11 @@ type Range struct { dur time.Duration } +type marshalTime struct { + StartTime time.Time `json:"StartTIme"` + EndTime time.Time `json:"EndTime"` +} + // String implements fmt.Stringer to print and log Range properly func (r Range) String() string { return r.UTC().Format(defaultRangeFmt) } @@ -182,6 +188,34 @@ func (r Range) Flip(ranges []Range) []Range { return r.flipValidRanges(rngs) } +func (r Range) MarshalJSON() ([]byte, error) { + data := marshalTime{ + StartTime: r.st, + EndTime: r.End(), + } + + jsonData, err := json.Marshal(data) + if err != nil { + fmt.Println("Error marshaling JSON:", err) + return nil, err + } + + return jsonData, nil +} + +func (r *Range) UnmarshalJSON(jsonData []byte) error { + var data marshalTime + + if err := json.Unmarshal(jsonData, &data); err != nil { + return err + } + + r.st = data.StartTime + r.dur = data.EndTime.Sub(data.StartTime) + + return nil +} + func (r Range) flipValidRanges(ranges []Range) []Range { var res []Range diff --git a/range_test.go b/range_test.go index 58301a2..e60f884 100644 --- a/range_test.go +++ b/range_test.go @@ -1,6 +1,7 @@ package trn import ( + "encoding/json" "testing" "time" @@ -515,3 +516,51 @@ func TestRange_GoString(t *testing.T) { func TestError_Error(t *testing.T) { assert.Equal(t, "blah", Error("blah").Error()) } +func TestRangeMarshalJSON(t *testing.T) { + // Create a sample Range instance + startTime := time.Date(2023, time.September, 6, 12, 0, 0, 0, time.UTC) + duration := time.Hour * 2 + r := Range{st: startTime, dur: duration} + + // Marshal the Range to JSON + jsonData, err := r.MarshalJSON() + if err != nil { + t.Fatalf("Error marshaling Range to JSON: %v", err) + } + + // Unmarshal the JSON data back into a Range + var unmarshaledRange Range + err = json.Unmarshal(jsonData, &unmarshaledRange) + if err != nil { + t.Fatalf("Error unmarshaling JSON to Range: %v", err) + } + + // Check if the unmarshaled Range has the same start and end time components + if !unmarshaledRange.st.Equal(startTime) || unmarshaledRange.dur != duration { + t.Errorf("Expected: %v, Got: %v", r, unmarshaledRange) + } +} + +func TestRangeUnmarshalJSON(t *testing.T) { + // Define a JSON string representing a Range + jsonData := []byte(`{"StartTime":"2023-09-06T12:00:00Z","EndTime":"2023-09-06T14:00:00Z"}`) + + // Create an empty Range + var r Range + + // Unmarshal the JSON data into the Range + err := r.UnmarshalJSON(jsonData) + if err != nil { + t.Fatalf("Error unmarshaling JSON to Range: %v", err) + } + + // Define the expected Range + expectedStartTime := time.Date(2023, time.September, 6, 12, 0, 0, 0, time.UTC) + expectedEndTime := time.Date(2023, time.September, 6, 14, 0, 0, 0, time.UTC) + expectedRange := Range{st: expectedStartTime, dur: expectedEndTime.Sub(expectedStartTime)} + + // Check if the unmarshaled Range has the same start and end time components + if !r.st.Equal(expectedStartTime) || r.dur != expectedRange.dur { + t.Errorf("Expected: %v, Got: %v", expectedRange, r) + } +}