package leaf var ( FilterAll = FilterDocument{} ) const ( OperatorEq Operator = "$eq" OperatorNe Operator = "$ne" OperatorGt Operator = "$gt" OperatorGte Operator = "$gte" OperatorLt Operator = "$lt" OperatorLte Operator = "$lte" OperatorIn Operator = "$in" OperatorNin Operator = "$nin" OperatorExists Operator = "$exists" OperatorRegex Operator = "$regex" ) type M map[Operator]any type Operator string type FilterDocument map[string]M func Eq[T any](field string, value T) FilterDocument { return createSelector(field, OperatorEq, value) } func Ne[T any](field string, value T) FilterDocument { return createSelector(field, OperatorNe, value) } func Gt[T any](field string, value T) FilterDocument { return createSelector(field, OperatorGt, value) } func Gte[T any](field string, value T) FilterDocument { return createSelector(field, OperatorGte, value) } func Lt[T any](field string, value T) FilterDocument { return createSelector(field, OperatorLt, value) } func Lte[T any](field string, value T) FilterDocument { return createSelector(field, OperatorLte, value) } func In[T any](field string, value []T) FilterDocument { return createSelector(field, OperatorIn, value) } func Nin[T any](field string, value []T) FilterDocument { return createSelector(field, OperatorNin, value) } func Exists(field string, value bool) FilterDocument { return createSelector(field, OperatorExists, value) } func Regex(field string, value string) FilterDocument { return createSelector(field, OperatorRegex, value) } func createSelector(field string, operator Operator, value any) FilterDocument { return FilterDocument{field: M{operator: value}} } func Filter(docs ...FilterDocument) FilterDocument { query := FilterDocument{} for _, doc := range docs { for field, operators := range doc { if _, ok := query[field]; !ok { query[field] = operators continue } for op, value := range operators { query[field][op] = value } } } return query }