github.com/aacfactory/fns-contrib/databases/sql@v1.2.84/dac/specifications/conditions.go (about) 1 package specifications 2 3 import ( 4 "fmt" 5 "github.com/aacfactory/errors" 6 "github.com/aacfactory/fns-contrib/databases/sql/dac/conditions" 7 "github.com/aacfactory/fns/commons/bytex" 8 "io" 9 "reflect" 10 ) 11 12 type Condition struct { 13 conditions.Condition 14 } 15 16 func (cond Condition) Render(ctx Context, w io.Writer) (arguments []any, err error) { 17 if cond.Left == nil { 18 return 19 } 20 switch left := cond.Left.(type) { 21 case Render: 22 args, rErr := left.Render(ctx, w) 23 if rErr != nil { 24 err = rErr 25 return 26 } 27 arguments = append(arguments, args...) 28 break 29 case conditions.Predicate: 30 args, rErr := Predicate{left}.Render(ctx, w) 31 if rErr != nil { 32 err = rErr 33 return 34 } 35 arguments = append(arguments, args...) 36 break 37 case conditions.Condition: 38 if left.Group { 39 _, _ = w.Write(LB) 40 } 41 args, rErr := Condition{left}.Render(ctx, w) 42 if rErr != nil { 43 err = rErr 44 return 45 } 46 if left.Group { 47 _, _ = w.Write(RB) 48 } 49 arguments = append(arguments, args...) 50 break 51 default: 52 err = errors.Warning("sql: condition render failed").WithCause(fmt.Errorf("%s is not supported", reflect.TypeOf(left).String())) 53 return 54 } 55 if cond.Operation == "" { 56 return 57 } 58 if cond.Right == nil { 59 err = errors.Warning("sql: condition render failed").WithCause(fmt.Errorf("invalid condition")) 60 return 61 } 62 _, _ = w.Write(SPACE) 63 _, _ = w.Write(bytex.FromString(cond.Operation.String())) 64 _, _ = w.Write(SPACE) 65 switch right := cond.Right.(type) { 66 case Render: 67 args, rErr := right.Render(ctx, w) 68 if rErr != nil { 69 err = rErr 70 return 71 } 72 arguments = append(arguments, args...) 73 break 74 case conditions.Predicate: 75 args, rErr := Predicate{right}.Render(ctx, w) 76 if rErr != nil { 77 err = rErr 78 return 79 } 80 arguments = append(arguments, args...) 81 break 82 case conditions.Condition: 83 if right.Group { 84 _, _ = w.Write(LB) 85 } 86 args, rErr := Condition{right}.Render(ctx, w) 87 if rErr != nil { 88 err = rErr 89 return 90 } 91 if right.Group { 92 _, _ = w.Write(RB) 93 } 94 arguments = append(arguments, args...) 95 break 96 default: 97 err = errors.Warning("sql: condition render failed").WithCause(fmt.Errorf("%s is not supported", reflect.TypeOf(right).String())) 98 return 99 } 100 return 101 }