package server import ( "errors" "fmt" "strconv" "strings" "time" ) func parseOptionalInt64(raw string) (*int64, error) { raw = strings.TrimSpace(raw) if raw == "" { return nil, nil } value, err := strconv.ParseInt(raw, 10, 64) if err != nil { return nil, errors.New("must be an integer") } if value < 0 { return nil, errors.New("must be at least 0") } return &value, nil } func parseCSVInt64(raw string) ([]int64, error) { raw = strings.TrimSpace(raw) if raw == "" { return nil, nil } parts := strings.Split(raw, ",") values := make([]int64, 0, len(parts)) for _, part := range parts { part = strings.TrimSpace(part) if part == "" { continue } value, err := strconv.ParseInt(part, 10, 64) if err != nil { return nil, fmt.Errorf("allowed expiry durations must be comma-separated seconds") } if value < 0 { return nil, fmt.Errorf("allowed expiry durations must be at least 0") } values = append(values, value) } return values, nil } func optionalInt64Label(value *int64) string { if value == nil { return "-" } return strconv.FormatInt(*value, 10) } func joinInt64s(values []int64) string { if len(values) == 0 { return "-" } parts := make([]string, 0, len(values)) for _, value := range values { parts = append(parts, strconv.FormatInt(value, 10)) } return strings.Join(parts, ", ") } func formatAdminTime(value time.Time) string { if value.IsZero() { return "-" } return value.Local().Format("2006-01-02 15:04:05") }