48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package domain
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// Duration is a wrapper around time.Duration that can unmarshal from both
|
|
// string duration formats (like "168h") and nanosecond integers
|
|
type Duration struct {
|
|
time.Duration
|
|
}
|
|
|
|
// UnmarshalJSON implements json.Unmarshaler interface
|
|
func (d *Duration) UnmarshalJSON(data []byte) error {
|
|
// Try to unmarshal as string first (e.g., "168h", "24h", "30m")
|
|
var str string
|
|
if err := json.Unmarshal(data, &str); err == nil {
|
|
duration, err := time.ParseDuration(str)
|
|
if err != nil {
|
|
return fmt.Errorf("invalid duration format: %s", str)
|
|
}
|
|
d.Duration = duration
|
|
return nil
|
|
}
|
|
|
|
// Try to unmarshal as integer (nanoseconds)
|
|
var ns int64
|
|
if err := json.Unmarshal(data, &ns); err == nil {
|
|
d.Duration = time.Duration(ns)
|
|
return nil
|
|
}
|
|
|
|
return fmt.Errorf("duration must be either a string (e.g., '168h') or integer nanoseconds")
|
|
}
|
|
|
|
// MarshalJSON implements json.Marshaler interface
|
|
func (d Duration) MarshalJSON() ([]byte, error) {
|
|
// Always marshal as nanoseconds for consistency
|
|
return json.Marshal(int64(d.Duration))
|
|
}
|
|
|
|
// String returns the string representation of the duration
|
|
func (d Duration) String() string {
|
|
return d.Duration.String()
|
|
}
|