diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/duration.go b/duration.go index ec88110..4de2098 100644 --- a/duration.go +++ b/duration.go @@ -10,13 +10,14 @@ import ( // Duration holds all the smaller units that make up the duration type Duration struct { - Years float64 - Months float64 - Weeks float64 - Days float64 - Hours float64 - Minutes float64 - Seconds float64 + originalString string + Years float64 + Months float64 + Weeks float64 + Days float64 + Hours float64 + Minutes float64 + Seconds float64 } const ( @@ -33,7 +34,9 @@ var ( // if parsing fails an error is returned instead func Parse(d string) (*Duration, error) { state := parsingPeriod - duration := &Duration{} + duration := &Duration{ + originalString: d, + } num := "" var err error @@ -137,3 +140,8 @@ func (duration *Duration) ToTimeDuration() time.Duration { return timeDuration } + +// String returns the duration string from which the *Duration was parsed +func (duration *Duration) String() string { + return duration.originalString +} diff --git a/duration_test.go b/duration_test.go index f8f1444..b4e1cfb 100644 --- a/duration_test.go +++ b/duration_test.go @@ -20,7 +20,8 @@ func TestParse(t *testing.T) { name: "period-only", args: args{d: "P4Y"}, want: &Duration{ - Years: 4, + originalString: "P4Y", + Years: 4, }, wantErr: false, }, @@ -28,7 +29,8 @@ func TestParse(t *testing.T) { name: "time-only-decimal", args: args{d: "T2.5S"}, want: &Duration{ - Seconds: 2.5, + originalString: "T2.5S", + Seconds: 2.5, }, wantErr: false, }, @@ -36,12 +38,13 @@ func TestParse(t *testing.T) { name: "full", args: args{d: "P3Y6M4DT12H30M5.5S"}, want: &Duration{ - Years: 3, - Months: 6, - Days: 4, - Hours: 12, - Minutes: 30, - Seconds: 5.5, + originalString: "P3Y6M4DT12H30M5.5S", + Years: 3, + Months: 6, + Days: 4, + Hours: 12, + Minutes: 30, + Seconds: 5.5, }, wantErr: false, }, @@ -130,3 +133,14 @@ func TestDuration_ToTimeDuration(t *testing.T) { }) } } + +func TestDuration_String(t *testing.T) { + duration, err := Parse("P3Y6M4DT12H30M5.5S") + if err != nil { + t.Fatal(err) + } + + if duration.String() != "P3Y6M4DT12H30M5.5S" { + t.Errorf("expected: %s, got: %s", "P3Y6M4DT12H30M5.5S", duration.String()) + } +}