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  }