package models import ( "fmt" "strings" ) type FieldExpression interface { fmt.Stringer JSONPathExpression() string IsCondition() bool } type FieldAttrValue struct { field string value any } var _ FieldExpression = (*FieldAttrValue)(nil) func (f FieldAttrValue) IsCondition() bool { return true } func (f FieldAttrValue) valueString() string { b := strings.Builder{} switch v := f.value.(type) { case int, int32, int64, float32, float64: fmt.Fprintf(&b, "%v", v) case string: b.WriteString(v) case fmt.Stringer: b.WriteString(v.String()) default: b.WriteString("!UNSUPPORTED") } return b.String() } func (f FieldAttrValue) String() string { return f.field + "=" + f.valueString() } func (f FieldAttrValue) JSONPathExpression() string { b := strings.Builder{} b.WriteString("@.") b.WriteString(f.field) b.WriteString("=='") b.WriteString(f.valueString()) b.WriteString("'") return b.String() } func NewFieldAttrValue(field string, value any) FieldAttrValue { return FieldAttrValue{field: field, value: value} } type FieldArrIndex struct { index int } var _ FieldExpression = (*FieldArrIndex)(nil) func (f FieldArrIndex) IsCondition() bool { return false } func (f FieldArrIndex) String() string { return fmt.Sprintf("%d", f.index) } func (f FieldArrIndex) JSONPathExpression() string { return fmt.Sprintf("%d", f.index) } func NewFieldArrIndex(index int) FieldArrIndex { return FieldArrIndex{index: index} } type MultiFieldAttrValue struct { values []FieldAttrValue } func (m MultiFieldAttrValue) IsCondition() bool { return true } func (m MultiFieldAttrValue) String() string { b := strings.Builder{} for idx, attr := range m.values { if idx > 0 { b.WriteString(", ") } b.WriteString(attr.String()) } return b.String() } func (m MultiFieldAttrValue) JSONPathExpression() string { b := strings.Builder{} if len(m.values) > 0 { for idx, attr := range m.values { if idx > 0 { b.WriteString(" && ") } b.WriteString(attr.JSONPathExpression()) } } return b.String() } func NewMultiFieldAttrValue(values ...FieldAttrValue) MultiFieldAttrValue { return MultiFieldAttrValue{values: values} } var _ FieldExpression = (*wildCard)(nil) var WildCard = wildCard{} type wildCard struct{} func (w wildCard) IsCondition() bool { return false } func (w wildCard) String() string { return "" } func (w wildCard) JSONPathExpression() string { return "*" }