package model import ( "encoding/json" "math" "strconv" "strings" "time" "airlines/pkg/airports" ) type Sex uint8 const ( SexUnknown Sex = 0 SexMale Sex = 1 SexFemale Sex = 2 ) func (s *Sex) UnmarshalJSON(b []byte) error { var raw string if err := json.Unmarshal(b, &raw); err == nil { switch strings.ToLower(strings.TrimSpace(raw)) { case "male": *s = SexMale return nil case "female": *s = SexFemale return nil case "", "unknown", "null": *s = SexUnknown return nil } } // also accept numbers in JSON var n int if err := json.Unmarshal(b, &n); err == nil { *s = Sex(n) return nil } *s = SexUnknown return nil } func TzFromAirportRecord(a airports.Airport) *time.Location { return TzFromOffsetHours(a.Timezone) } func TzFromOffsetHours(hours float64) *time.Location { minTotal := int(math.Round(hours * 60.0)) sec := minTotal * 60 name := fixedZoneNameFromMinutes(minTotal) return time.FixedZone(name, sec) } func fixedZoneNameFromMinutes(minTotal int) string { sign := "+" if minTotal < 0 { sign = "-" minTotal = -minTotal } h := minTotal / 60 m := minTotal % 60 return "UTC" + sign + two(h) + ":" + two(m) } func two(x int) string { if x < 10 { return "0" + strconv.Itoa(x) } return strconv.Itoa(x) }