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]. // // Access the underlying time.Duration via the embedded field: // // cfg.Server.ReadTimeout.Duration // time.Duration value // // Duration values work directly with time functions that accept // time.Duration because of the embedding: // // time.After(cfg.Server.ReadTimeout.Duration) 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 }