// Copyright 2025-present Gustavo "Guz" L. de Mello // Copyright 2025-present The Lored.dev Contributors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package problem import ( "encoding" "fmt" "net/http" "time" ) type RetryAfter[T time.Time | time.Duration] struct { time T } var ( _ encoding.TextMarshaler = RetryAfter[time.Time]{} _ fmt.Stringer = RetryAfter[time.Time]{} ) func (h RetryAfter[T]) MarshalText() ([]byte, error) { return []byte(h.String()), nil } func (h RetryAfter[T]) String() string { switch t := any(h.time).(type) { case time.Time: if !t.IsZero() { return t.Format(http.TimeFormat) } case time.Duration: return fmt.Sprintf("%.0f", t.Seconds()) } return "" }