Skip to content

Commit

Permalink
feat: add picker to pick value from record
Browse files Browse the repository at this point in the history
  • Loading branch information
veezhang committed Dec 13, 2022
1 parent 398992c commit bddedbf
Show file tree
Hide file tree
Showing 15 changed files with 1,419 additions and 0 deletions.
93 changes: 93 additions & 0 deletions pkg/picker/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package picker

import "fmt"

// Config is the configuration to build Picker
// The priority is as follows:
// ConcatItems > Indices
// Nullable
// DefaultValue
// NullValue, if set to null, subsequent conversions will be skipped.
// Type
// Function
type Config struct {
ConcatItems ConcatItems // Concat index column, constant, or mixed.
Indices []int // Set index columns, the first non-null.
Nullable func(string) bool // Determine whether it is null. Optional.
NullValue string // Set null value when it is null. Optional.
DefaultValue *string // Set default value when it is null. Optional.
Type string // Set the type of value.
Function *string // Set the conversion function of value.
}

func (c *Config) Build() (Picker, error) {
var retPicker Picker
var nullHandled bool
switch {
case c.ConcatItems.Len() > 0:
retPicker = ConcatPicker{
items: c.ConcatItems,
}
case len(c.Indices) == 1:
retPicker = IndexPicker(c.Indices[0])
case len(c.Indices) > 1:
if c.Nullable == nil {
// the first must be picked
retPicker = IndexPicker(c.Indices[0])
} else {
pickers := make(NullablePickers, 0, len(c.Indices))
for _, index := range c.Indices {
pickers = append(pickers, ConverterPicker{
picker: IndexPicker(index),
converter: NullableConverters{
NullableConverter{
Nullable: c.Nullable,
},
},
})
}
retPicker = pickers
}
nullHandled = true
default:
return nil, fmt.Errorf("no indices or concat items")
}

var converters []Converter

if !nullHandled && c.Nullable != nil {
converters = append(converters, NullableConverter{
Nullable: c.Nullable,
})
}

if c.Nullable != nil {
if c.DefaultValue != nil {
converters = append(converters, DefaultConverter{
Value: *c.DefaultValue,
})
} else {
converters = append(converters, NullConverter{
Value: c.NullValue,
})
}
}

converters = append(converters, NewTypeConverter(c.Type))

if c.Function != nil {
converters = append(converters, FuncConverter{
Name: *c.Function,
})
}

var converter Converter = Converters(converters)
if c.Nullable != nil {
converter = NullableConverters(converters)
}

return ConverterPicker{
picker: retPicker,
converter: converter,
}, nil
}
Loading

0 comments on commit bddedbf

Please sign in to comment.