@@ -14,6 +14,7 @@ import (
14
14
"time"
15
15
16
16
"github.com/dustin/go-humanize"
17
+ "github.com/karrick/tparse"
17
18
"github.com/scaleway/scaleway-sdk-go/scw"
18
19
"github.com/scaleway/scaleway-sdk-go/strcase"
19
20
"github.com/scaleway/scaleway-sdk-go/validation"
@@ -25,6 +26,8 @@ type Unmarshaler interface {
25
26
26
27
type UnmarshalFunc func (value string , dest interface {}) error
27
28
29
+ var TestForceNow * time.Time
30
+
28
31
var unmarshalFuncs = map [reflect.Type ]UnmarshalFunc {
29
32
reflect .TypeOf ((* scw .Size )(nil )).Elem (): func (value string , dest interface {}) error {
30
33
// Only support G, GB for now (case insensitive).
@@ -61,13 +64,32 @@ var unmarshalFuncs = map[reflect.Type]UnmarshalFunc{
61
64
62
65
reflect .TypeOf ((* time .Time )(nil )).Elem (): func (value string , dest interface {}) error {
63
66
// Handle absolute time
64
- t , err := time .Parse (time .RFC3339 , value )
65
- if err != nil {
66
- return err
67
+ absoluteTimeParsed , absoluteErr := time .Parse (time .RFC3339 , value )
68
+ if absoluteErr == nil {
69
+ * (dest .(* time.Time )) = absoluteTimeParsed
70
+ return nil
67
71
}
68
72
69
- * (dest .(* time.Time )) = t
70
- return nil
73
+ // Handle relative time
74
+ if value [0 ] != '+' && value [0 ] != '-' {
75
+ value = "+" + value
76
+ }
77
+ m := map [string ]time.Time {
78
+ "t" : time .Now (),
79
+ }
80
+ if TestForceNow != nil {
81
+ m ["t" ] = * TestForceNow
82
+ }
83
+ relativeTimeParsed , relativeErr := tparse .ParseWithMap (time .RFC3339 , "t" + value , m )
84
+ if relativeErr == nil {
85
+ * (dest .(* time.Time )) = relativeTimeParsed
86
+ return nil
87
+ }
88
+ return & CannotParseDateError {
89
+ ArgValue : value ,
90
+ AbsoluteTimeParseError : absoluteErr ,
91
+ RelativeTimeParseError : relativeErr ,
92
+ }
71
93
},
72
94
}
73
95
@@ -370,7 +392,7 @@ func unmarshalScalar(value string, dest reflect.Value) error {
370
392
case "false" :
371
393
dest .SetBool (false )
372
394
default :
373
- return fmt . Errorf ( "invalid boolean value" )
395
+ return & CannotParseBoolError { Value : value }
374
396
}
375
397
return nil
376
398
case reflect .String :
0 commit comments