package alamo import ( "bytes" "encoding/json" "fmt" ) type controlSettings struct { Mode string `json:"mode"` TargetTemperature float64 `json:"target_temperature"` } func decodeControl(value json.RawMessage) (controlSettings, error) { var fields struct { Mode *string `json:"mode"` Target *float64 `json:"target_temperature"` } decoder := json.NewDecoder(bytes.NewReader(value)) decoder.DisallowUnknownFields() err := decoder.Decode(&fields) if err != nil { return controlSettings{}, fmt.Errorf("decode control settings: %w", err) } if !json.Valid(value) || fields.Mode == nil || fields.Target == nil { return controlSettings{}, fmt.Errorf("control settings must contain mode and target temperature") } if *fields.Mode != "off" && *fields.Mode != "heat" { return controlSettings{}, fmt.Errorf("control mode must be off or heat") } if !finite(*fields.Target) { return controlSettings{}, fmt.Errorf("target temperature must be finite") } return controlSettings{ Mode: *fields.Mode, TargetTemperature: *fields.Target, }, nil }