package cobol import ( "errors" "fmt" "time" "google.golang.org/protobuf/types/known/timestamppb" ) // you will be happier if you just use this everywhere func Time(someTimeAgoOrLaterNotsure any) string { guess, t, err := TimeCheck(someTimeAgoOrLaterNotsure) if errors.Is(err, Broken) { if len(guess) > 0 { return fmt.Sprintf("%-15s", guess) } return "bad" } if errors.Is(err, NoTime) { if len(guess) > 0 { return fmt.Sprintf("%-15s", guess) } return "nope" } if len(guess) > 0 { return fmt.Sprintf("%-15s", guess) } return FormatTime(*t) } func isUTC(t time.Time) bool { return t.Location() == time.UTC } func TimeLocal(someTimeAgoOrLaterNotsure any) string { guess, t, err := TimeCheck(someTimeAgoOrLaterNotsure) if errors.Is(err, Broken) { if len(guess) > 0 { return fmt.Sprintf("%-15s", guess) } return "bad" } if errors.Is(err, NoTime) { if len(guess) > 0 { return fmt.Sprintf("%-15s", guess) } return "nope" } return FormatTimeLocal(*t) } func GetTime(mightBeTimeMightNotBeTime any) (time.Time, error) { _, t, err := TimeCheck(mightBeTimeMightNotBeTime) if t == nil { var emptyTime time.Time return emptyTime, err } return *t, err } func TimeCheck(maybeTime any) (string, *time.Time, error) { var guess string var t *time.Time var err error switch v := maybeTime.(type) { case time.Time: // If the type is time.Time, 'v' is now a time.Time variable. // t = v return FormatTime(v), &v, err case string: // The type is string, so 'v' is a string variable. t, err = doTimeString(v) if t != nil { return "", t, err } if err != nil { guess = v } case *timestamppb.Timestamp: // If it's a protobuf Timestamp pointer (most common case), // 'v' is a *timestamppb.Timestamp. We must convert it. // It's also good to check if it's a valid timestamp. if v.IsValid() { newt := v.AsTime() return FormatTime(newt), &newt, nil } else { err = errors.New("pb time invalid") } case timestamppb.Timestamp: // Handle the less common case of a value type instead of a pointer. if v.IsValid() { newt := v.AsTime() return FormatTime(newt), &newt, nil } default: err = errors.Join(err, NoTime) } return guess, t, err }