azkustodata/kql/builder.go (85 lines of code) (raw):

package kql import ( "errors" "fmt" "github.com/Azure/azure-kusto-go/azkustodata/value" "github.com/google/uuid" "github.com/shopspring/decimal" "strings" "time" ) // stringConstant is an internal type that cannot be created outside the package. The only two ways to build // a stringConstant is to pass a string constant or use a local function to build the stringConstant. // This allows us to enforce the use of constants or strings built with injection protection. type stringConstant string // String implements fmt.Stringer. func (s stringConstant) String() string { return string(s) } type Builder struct { builder strings.Builder } func New(value stringConstant) *Builder { return (&Builder{ builder: strings.Builder{}, }).AddLiteral(value) } func FromBuilder(builder *Builder) *Builder { return New(stringConstant(builder.String())) } // String implements fmt.Stringer. func (b *Builder) String() string { return b.builder.String() } func (b *Builder) addBase(value fmt.Stringer) *Builder { b.builder.WriteString(value.String()) return b } func (b *Builder) AddValue(v value.Kusto) *Builder { b.builder.WriteString(QuoteValue(v)) return b } // AddUnsafe enables unsafe actions on a Builder - adds a string as is, no validation checking or escaping. // This turns off safety features that could allow a service client to compromise your data store. // USE AT YOUR OWN RISK! func (b *Builder) AddUnsafe(value string) *Builder { b.builder.WriteString(value) return b } func (b *Builder) AddLiteral(value stringConstant) *Builder { return b.addBase(value) } func (b *Builder) AddBool(v bool) *Builder { return b.AddValue(value.NewBool(v)) } func (b *Builder) AddDateTime(v time.Time) *Builder { return b.AddValue(value.NewDateTime(v)) } func (b *Builder) AddDynamic(v interface{}) *Builder { return b.AddValue(value.DynamicFromInterface(v)) } func (b *Builder) AddSerializedDynamic(v []byte) *Builder { return b.AddValue(value.NewDynamic(v)) } func (b *Builder) AddGUID(v uuid.UUID) *Builder { return b.AddValue(value.NewGUID(v)) } func (b *Builder) AddInt(v int32) *Builder { return b.AddValue(value.NewInt(v)) } func (b *Builder) AddLong(v int64) *Builder { return b.AddValue(value.NewLong(v)) } func (b *Builder) AddReal(v float64) *Builder { return b.AddValue(value.NewReal(v)) } func (b *Builder) AddString(v string) *Builder { return b.AddValue(value.NewString(v)) } func (b *Builder) AddTimespan(v time.Duration) *Builder { return b.AddValue(value.NewTimespan(v)) } func (b *Builder) AddDecimal(v decimal.Decimal) *Builder { return b.AddValue(value.NewDecimal(v)) } func (b *Builder) GetParameters() (map[string]string, error) { return nil, errors.New("this option does not support Parameters") } func (b *Builder) SupportsInlineParameters() bool { return false } // Reset resets the stringBuilder func (b *Builder) Reset() { b.builder.Reset() }