package freshness import ( "errors" "time" "github.com/itworx/pulse/internal/datasource" ) type Input struct { SourceID string Required bool Health datasource.SourceHealth Previous datasource.HealthState Now time.Time } type Result struct { State datasource.HealthState Age *time.Duration LastKnownAt time.Time Recovery bool Event string Warning string } func Evaluate(input Input) (Result, error) { if input.SourceID == "" { return Result{}, errors.New("source id is required") } now := input.Now if now.IsZero() { now = time.Now().UTC() } if err := input.Health.Validate(now); err != nil { return Result{}, err } result := Result{State: input.Health.EffectiveState(now), LastKnownAt: input.Health.ObservedAt} if !input.Health.ObservedAt.IsZero() { age := now.Sub(input.Health.ObservedAt) if age < 0 { age = 0 } result.Age = &age } if input.Required && result.State != datasource.HealthHealthy && result.State != datasource.HealthDegraded { result.State = datasource.HealthUnknown result.Warning = "REQUIRED_SOURCE_UNKNOWN" } if input.Previous == datasource.HealthUnknown && (result.State == datasource.HealthHealthy || result.State == datasource.HealthDegraded) { result.Recovery = true result.Event = "DATASOURCE_RECOVERED" } return result, nil }