package request import ( "errors" "strings" "github.com/openmeterio/openmeter/pkg/sortx" ) type SortOrder string const ( SortOrderAsc SortOrder = "asc" SortOrderDesc SortOrder = "desc" ) var ( ErrSortByInvalid = errors.New("invalid sort by") ErrSortFieldRequired = errors.New("sort field is required") ErrSortOrderInvalid = errors.New("sort order must be either asc or desc") defaultOrder = SortOrderAsc ) func (s SortOrder) Validate() error { if s != SortOrderAsc && s != SortOrderDesc { return ErrSortOrderInvalid } return nil } type SortBy struct { Field string Order SortOrder } func ParseSortBy(sort string) (*SortBy, error) { var s SortBy err := s.UnmarshalText([]byte(sort)) if err != nil { return nil, err } return &s, nil } func (s SortBy) Validate() error { if s.Field == "" { return ErrSortFieldRequired } if err := s.Order.Validate(); err != nil { return err } return nil } func (s *SortBy) UnmarshalText(text []byte) error { parts := strings.Fields(string(text)) if len(parts) == 0 { return ErrSortByInvalid } if len(parts) > 2 { return ErrSortByInvalid } s.Field = parts[0] if len(parts) == 2 { s.Order = SortOrder(parts[1]) } else { s.Order = defaultOrder } return s.Validate() } func (s SortOrder) ToSortxOrder() sortx.Order { if s == SortOrderAsc { return sortx.OrderAsc } return sortx.OrderDesc }