package paramParser import ( "fmt" "log/slog" "net/url" "strconv" "time" ) type ParamsParser struct { urlParams url.Values } type NoValueError struct { Key string } func (e *NoValueError) Error() string { return fmt.Sprintf("No value found for key %s", e.Key) } func New(_urlParams url.Values) ParamsParser { return ParamsParser{ urlParams: _urlParams, } } func (p *ParamsParser) ParseTimestampFallback(key string, format string, fallback time.Time) time.Time { if !p.urlParams.Has(key) { return fallback } paramTimestamp := p.urlParams.Get(key) if timestamp, err := time.Parse(format, paramTimestamp); err == nil { return timestamp } else { slog.Warn("Error parsing HTTP Params to time.Time", slog.Any("key", key), slog.Any("error", err)) return fallback } } func (p *ParamsParser) ParseTimestamp(key string, format string) (time.Time, error) { if !p.urlParams.Has(key) { return time.Time{}, &NoValueError{Key: key} } paramTimestamp := p.urlParams.Get(key) if timestamp, err := time.Parse(format, paramTimestamp); err == nil { return timestamp, nil } else { slog.Debug("Error parsing HTTP Params to time.Time", slog.Any("key", key), slog.Any("error", err)) return timestamp, err } } func (p *ParamsParser) ParseStringFallback(key string, fallback string) string { if !p.urlParams.Has(key) { return fallback } return p.urlParams.Get(key) } func (p *ParamsParser) ParseString(key string, fallback string) (string, error) { if !p.urlParams.Has(key) { return "", &NoValueError{Key: key} } return p.urlParams.Get(key), nil } func (p *ParamsParser) ParseIntFallback(key string, fallback int) int { if !p.urlParams.Has(key) { return fallback } paramInt := p.urlParams.Get(key) if result, err := strconv.Atoi(paramInt); err == nil { return result } else { slog.Warn("Error parsing HTTP Params to Int", slog.Any("key", key), slog.Any("error", err)) return fallback } } func (p *ParamsParser) ParseInt(key string) (int, error) { if !p.urlParams.Has(key) { return 0, &NoValueError{Key: key} } paramInt := p.urlParams.Get(key) if result, err := strconv.Atoi(paramInt); err == nil { return result, nil } else { slog.Debug("Error parsing HTTP Params to Int", slog.Any("key", key), slog.Any("error", err)) return 0, err } }