Skip to content

Commit 6192ef3

Browse files
mromaszewiczclaude
andcommitted
fix: correct time.Time date-only fallback parsing in deepObject
The date-only fallback in assignPathValues erroneously returned an error wrapping nil after a successful parse, preventing date-only strings from being unmarshalled into time.Time fields via deepObject. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 03288f9 commit 6192ef3

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

deepobject.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,10 @@ func assignPathValues(dst interface{}, pathValues fieldOrValue) error {
258258
tm, err = time.Parse(time.RFC3339Nano, pathValues.value)
259259
if err != nil {
260260
// Fall back to parsing it as a date.
261-
_, err = time.Parse(types.DateFormat, pathValues.value) // the time result is never used, so it doesn't need to be assigned
261+
tm, err = time.Parse(types.DateFormat, pathValues.value)
262262
if err != nil {
263263
return fmt.Errorf("error parsing '%s' as RFC3339 or 2006-01-02 time: %w", pathValues.value, err)
264264
}
265-
return fmt.Errorf("invalid date format: %w", err)
266265
}
267266
dst := iv
268267
if it != reflect.TypeOf(time.Time{}) {

deepobject_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,42 @@ type Item struct {
123123
Value string `json:"value"`
124124
}
125125

126+
func TestDeepObject_TimeFields(t *testing.T) {
127+
type TimeObject struct {
128+
Created time.Time `json:"created"`
129+
}
130+
131+
t.Run("RFC3339 time parses correctly", func(t *testing.T) {
132+
params := url.Values{}
133+
params.Set("p[created]", "2024-01-15T10:30:00Z")
134+
135+
var dst TimeObject
136+
err := UnmarshalDeepObject(&dst, "p", params)
137+
require.NoError(t, err)
138+
assert.Equal(t, time.Date(2024, 1, 15, 10, 30, 0, 0, time.UTC), dst.Created)
139+
})
140+
141+
t.Run("date-only string parses correctly as time.Time", func(t *testing.T) {
142+
params := url.Values{}
143+
params.Set("p[created]", "2024-01-15")
144+
145+
var dst TimeObject
146+
err := UnmarshalDeepObject(&dst, "p", params)
147+
require.NoError(t, err)
148+
assert.Equal(t, time.Date(2024, 1, 15, 0, 0, 0, 0, time.UTC), dst.Created)
149+
})
150+
151+
t.Run("invalid time string returns error", func(t *testing.T) {
152+
params := url.Values{}
153+
params.Set("p[created]", "not-a-time")
154+
155+
var dst TimeObject
156+
err := UnmarshalDeepObject(&dst, "p", params)
157+
require.Error(t, err)
158+
assert.Contains(t, err.Error(), "error parsing")
159+
})
160+
}
161+
126162
func TestDeepObject_ArrayOfObjects(t *testing.T) {
127163
// Test case for:
128164
// name: items

0 commit comments

Comments
 (0)