diff --git a/v2/humautils/humautils.go b/v2/humautils/humautils.go index 6809613..5a401ee 100644 --- a/v2/humautils/humautils.go +++ b/v2/humautils/humautils.go @@ -3,6 +3,7 @@ package humautils import ( "context" "log/slog" + "reflect" "strings" "github.com/danielgtaylor/huma/v2" @@ -26,6 +27,24 @@ type PaginationParameters struct { Sort []string `query:"sort"` } +// OptionalQueryParam wraps query params to expose whether the parameter was explicitly set. +type OptionalQueryParam[T any] struct { + Value T + IsSet bool +} + +func (o OptionalQueryParam[T]) Schema(r huma.Registry) *huma.Schema { + return huma.SchemaFromType(r, reflect.TypeOf(o.Value)) +} + +func (o *OptionalQueryParam[T]) Receiver() reflect.Value { + return reflect.ValueOf(o).Elem().Field(0) +} + +func (o *OptionalQueryParam[T]) OnParamSet(isSet bool, _ any) { + o.IsSet = isSet +} + // DownloadResult is a base struct for file download responses type DownloadResult struct { Length int64 `header:"Content-Length" doc:"The content length"`