package config import ( "fmt" "time" ) // Duration is a time.Duration that can be unmarshalled from a TOML string // (e.g., "30s", "5m"). go-toml v2 does not natively decode strings into // time.Duration, so this wrapper implements encoding.TextUnmarshaler. type Duration struct { time.Duration } // UnmarshalText implements encoding.TextUnmarshaler for TOML string decoding. func (d *Duration) UnmarshalText(text []byte) error { parsed, err := time.ParseDuration(string(text)) if err != nil { return fmt.Errorf("invalid duration %q: %w", string(text), err) } d.Duration = parsed return nil } // MarshalText implements encoding.TextMarshaler for TOML string encoding. func (d Duration) MarshalText() ([]byte, error) { return []byte(d.String()), nil }