package clause import "strings" type Conditions struct { queries []string args [][]any err error } func NewConditions() *Conditions { return &Conditions{ queries: make([]string, 0), args: make([][]any, 0), } } func (conditions *Conditions) AddCondition(query string, args ...any) *Conditions { conditions.queries = append(conditions.queries, query) conditions.args = append(conditions.args, args) return conditions } func (conditions *Conditions) Equal(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.queries = append(conditions.queries, columnName+" = ?") conditions.args = append(conditions.args, []any{arg}) return conditions } func (conditions *Conditions) Like(columnName string, arg string) *Conditions { if conditions.err != nil { return conditions } conditions.queries = append(conditions.queries, columnName+" LIKE ?") conditions.args = append(conditions.args, []any{arg}) return conditions } func (conditions *Conditions) In(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.queries = append(conditions.queries, columnName+" IN ?") conditions.args = append(conditions.args, []any{arg}) return conditions } func (conditions *Conditions) NotIn(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.queries = append(conditions.queries, columnName+" NOT IN ?") conditions.args = append(conditions.args, []any{arg}) return conditions } func (conditions *Conditions) Not(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.queries = append(conditions.queries, columnName+" != ?") conditions.args = append(conditions.args, []any{arg}) return conditions } func (conditions *Conditions) LessThan(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.queries = append(conditions.queries, columnName+" < ?") conditions.args = append(conditions.args, []any{arg}) return conditions } func (conditions *Conditions) LessThanAndEqual(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.queries = append(conditions.queries, columnName+" <= ?") conditions.args = append(conditions.args, []any{arg}) return conditions } func (conditions *Conditions) GreaterThan(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.queries = append(conditions.queries, columnName+" > ?") conditions.args = append(conditions.args, []any{arg}) return conditions } func (conditions *Conditions) GreaterThanAndEqual(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.queries = append(conditions.queries, columnName+" >= ?") conditions.args = append(conditions.args, []any{arg}) return conditions } func (conditions *Conditions) And() *And { return &And{conditions: conditions} } func (conditions *Conditions) Or() *Or { return &Or{conditions: conditions} } func (conditions *Conditions) formClause(conditionOperator string) (string, error) { if conditions.queries == nil || len(conditions.queries) == 0 { return "", nil } stringBuilder := strings.Builder{} for i, query := range conditions.queries { stringBuilder.WriteString(query) if i != len(conditions.queries)-1 { stringBuilder.WriteString(" " + conditionOperator + " ") } } return stringBuilder.String(), nil } func (conditions *Conditions) formArgs() []any { args := make([]any, 0) for _, conditionArgs := range conditions.args { if conditionArgs == nil { continue } if len(conditionArgs) == 1 { args = append(args, conditionArgs[0]) } else { args = append(args, conditionArgs) } } return args } type And struct { conditions *Conditions } func (and *And) Clause() (string, error) { return and.conditions.formClause("AND") } func (and *And) Args() []any { return and.conditions.formArgs() } type Or struct { conditions *Conditions } func (or *Or) Clause() (string, error) { return or.conditions.formClause("OR") } func (or *Or) Args() []any { return or.conditions.formArgs() }