Documentation ¶
Overview ¶
Package gtly defines generic data types
To reduce memory footprint and to avoid reflection, slice position based storage is used with shared proto object. Proto object controls conversion between Field and Field position withing given object, slice item
Index ¶
- Constants
- Variables
- func Value(value interface{}) interface{}
- type Accessor
- func (m *Accessor) Bool(object *Object) bool
- func (m *Accessor) Bytes(object *Object) []byte
- func (m *Accessor) Float32(object *Object) float32
- func (m *Accessor) Float64(object *Object) float64
- func (m *Accessor) Int(object *Object) int
- func (m *Accessor) Int64(object *Object) int64
- func (m *Accessor) String(object *Object) string
- func (m *Accessor) StringPtr(object *Object) *string
- func (m *Accessor) Time(object *Object) time.Time
- func (m *Accessor) TimePtr(object *Object) *time.Time
- func (m *Accessor) Value(object *Object) interface{}
- type Array
- func (a *Array) Add(value map[string]interface{}) error
- func (a *Array) AddObject(object *Object)
- func (a *Array) First() *Object
- func (a *Array) Objects(handler func(item *Object) (bool, error)) error
- func (a *Array) Proto() *Proto
- func (a *Array) Range(handler func(item interface{}) (bool, error)) error
- func (a *Array) Size() int
- type Collection
- type Field
- type Fields
- type Index
- type KeyProvider
- type Map
- func (m *Map) Add(values map[string]interface{}) error
- func (m *Map) AddObject(obj *Object)
- func (m *Map) First() *Object
- func (m *Map) Object(key interface{}) *Object
- func (m *Map) Objects(handler func(item *Object) (bool, error)) error
- func (m *Map) Pairs(handler func(key interface{}, item *Object) (bool, error)) error
- func (m *Map) Proto() *Proto
- func (m *Map) PutObject(key interface{}, object *Object)
- func (m *Map) Range(handler func(item interface{}) (bool, error)) error
- func (m *Map) Size() int
- type Multimap
- func (m *Multimap) Add(values map[string]interface{}) error
- func (m *Multimap) AddObject(o *Object)
- func (m *Multimap) First() *Object
- func (m *Multimap) IsNil() bool
- func (m *Multimap) Objects(handler func(item *Object) (bool, error)) error
- func (m *Multimap) Proto() *Proto
- func (m *Multimap) Range(handler func(item interface{}) (bool, error)) error
- func (m *Multimap) Size() int
- func (m *Multimap) Slice(key string) *Array
- func (m *Multimap) Slices(handler func(key interface{}, value *Array) (bool, error)) error
- type Mutator
- func (m *Mutator) Bool(object *Object, value bool)
- func (m *Mutator) Bytes(object *Object, value []byte)
- func (m *Mutator) Float32(object *Object, value float32)
- func (m *Mutator) Float64(object *Object, value float64)
- func (m *Mutator) Int(object *Object, value int)
- func (m *Mutator) Int64(object *Object, value int64)
- func (m *Mutator) SetValue(object *Object, value interface{})
- func (m *Mutator) String(object *Object, value string)
- func (m *Mutator) StringPtr(object *Object, value *string)
- func (m *Mutator) Time(object *Object, value time.Time)
- func (m *Mutator) TimePtr(object *Object, value *time.Time)
- type Nilable
- type Object
- func (o *Object) Addr() unsafe.Pointer
- func (o *Object) AsMap() map[string]interface{}
- func (o *Object) Field(name string) *Field
- func (o *Object) FieldOutputName(field *Field) string
- func (o *Object) Interface() interface{}
- func (o *Object) IsNil() bool
- func (o *Object) Proto() *Proto
- func (o *Object) Set(val interface{}) error
- func (o *Object) SetAt(index int) bool
- func (o *Object) SetValue(fieldName string, value interface{})
- func (o *Object) SetValueAt(fieldIndex int, value interface{})
- func (o *Object) Value(fieldName string) interface{}
- func (o *Object) ValueAt(fieldIndex int) (interface{}, bool)
- type Option
- type Proto
- func (p *Proto) Accessor(fieldName string) *Accessor
- func (p *Proto) AccessorAt(index int) *Accessor
- func (p *Proto) Field(name string) *Field
- func (p *Proto) FieldAt(index int) *Field
- func (p *Proto) Fields() []Field
- func (p *Proto) Hide(name string)
- func (p *Proto) InputCaseFormat(source, input format.Case) error
- func (p *Proto) Mutator(fieldName string) *Mutator
- func (p *Proto) MutatorAt(index int) *Mutator
- func (p *Proto) OutputCaseFormat(source, output format.Case) error
- func (p *Proto) SetEmptyValues(values ...interface{})
- func (p *Proto) SetOmitEmpty(omitEmpty bool)
- func (p *Proto) Show(name string)
- func (p *Proto) SimpleName() string
- func (p *Proto) Size() int
- func (p *Proto) Type() reflect.Type
- type Provider
- func (p *Provider) NewArray(items ...*Object) *Array
- func (p *Provider) NewMap(keyProvider KeyProvider) *Map
- func (p *Provider) NewMultimap(keyProvider KeyProvider) *Multimap
- func (p *Provider) NewObject() *Object
- func (p *Provider) Object(value interface{}) (*Object, error)
- func (p *Provider) UnMarshall(data []byte) (*Object, error)
- type Zeroable
Examples ¶
Constants ¶
const ( //FieldTypeInt int type FieldTypeInt = "int" //FieldTypeInt64 int type FieldTypeInt64 = "int64" //FieldTypeFloat32 float type FieldTypeFloat32 = "float32" //FieldTypeFloat64 float type FieldTypeFloat64 = "float64" //FieldTypeBool bool type FieldTypeBool = "bool" //FieldTypeString string type FieldTypeString = "string" //FieldTypeTime time type FieldTypeTime = "time" //FieldTypeBytes bytes type FieldTypeBytes = "bytes" //FieldTypeArray array type FieldTypeArray = "array" //FieldTypeObject object type FieldTypeObject = "object" )
Variables ¶
var NilValue = make([]*interface{}, 1)[0]
NilValue is used to discriminate between unset fileds, and set filed with nil value (for REST patch operation)
Functions ¶
Types ¶
type Accessor ¶ added in v0.2.0
Accessor represents object mutator
type Array ¶
type Array struct {
// contains filtered or unexported fields
}
Array represents dynamic object slice
type Collection ¶
type Collection interface { //Add adds item to collection Add(values map[string]interface{}) error //AddObject add an object AddObject(object *Object) //Range calls handler with collection item Range(handler func(item interface{}) (toContinue bool, err error)) error //Objects calls handler with collection item object Objects(handler func(item *Object) (toContinue bool, err error)) error //Size returns collection size Size() int //Proto return collection component prototype Proto() *Proto //First returns first object First() *Object }
Collection represents generic collection
type Field ¶
type Field struct { Name string `json:",omitempty"` Index int StructTag reflect.StructTag OmitEmpty *bool `json:",omitempty"` DateFormat string `json:",omitempty"` DataLayout string `json:",omitempty"` DataType string `json:",omitempty"` InputName string `json:",omitempty"` ComponentType string `json:",omitempty"` Type reflect.Type `json:"-"` // contains filtered or unexported fields }
Field represents dynamic filed
func (*Field) SetProvider ¶
SetProvider set provider
func (*Field) ShallOmitEmpty ¶
ShallOmitEmpty return true if shall omit empty
type KeyProvider ¶ added in v0.2.0
type KeyProvider func(o *Object) interface{}
KeyProvider represents a key provider
func NewKeyProvider ¶ added in v0.2.0
func NewKeyProvider(fieldName string) KeyProvider
NewKeyProvider creates a key provider
type Map ¶
type Map struct {
// contains filtered or unexported fields
}
Map represents generic map
type Multimap ¶
type Multimap struct {
// contains filtered or unexported fields
}
Multimap represents generic multi map
type Mutator ¶ added in v0.2.0
Mutator represents object mutator
type Object ¶
type Object struct {
// contains filtered or unexported fields
}
Object represents dynamic object
func (*Object) FieldOutputName ¶ added in v0.2.0
FieldOutputName returns Field output name
func (*Object) Interface ¶ added in v0.2.0
func (o *Object) Interface() interface{}
Interface returns a struct value
func (*Object) Set ¶ added in v0.2.0
Set sets a value from a map of a slice (slice index has to match field index)
func (*Object) SetValueAt ¶ added in v0.2.0
SetValueAt sets field's value
type Option ¶
type Option func(field *Field)
Option represents Field option
func ComponentTypeOpt ¶
ComponentTypeOpt return a Field component type option
func DateLayoutOpt ¶
DateLayoutOpt Field with data layout option
func OmitEmptyOpt ¶
OmitEmptyOpt returns a Field omit empty option
func ProviderOpt ¶
ProviderOpt return a Field provider option
type Proto ¶
Proto represents generic type prototype
func (*Proto) AccessorAt ¶ added in v0.2.0
AccessorAt returns a field accessor
func (*Proto) InputCaseFormat ¶
InputCaseFormat set output case format
func (*Proto) OutputCaseFormat ¶
OutputCaseFormat set output case format
func (*Proto) SetEmptyValues ¶
func (p *Proto) SetEmptyValues(values ...interface{})
SetEmptyValues sets empty values, use only if empty values are non in default map: nil, empty string
func (*Proto) SetOmitEmpty ¶
SetOmitEmpty sets omit empty flag
type Provider ¶
type Provider struct {
*Proto
}
Provider provides shares proto data across all dynamic types
func NewProvider ¶
NewProvider creates provider
func (*Provider) NewArray ¶
NewArray creates a slice
Example ¶
TestProvider_NewArray new array example
package main import ( "fmt" "github.com/viant/gtly" "github.com/viant/gtly/codec/json" "log" "time" ) func main() { fooProvider, err := gtly.NewProvider("foo", gtly.NewField("id", gtly.FieldTypeInt), gtly.NewField("firsName", gtly.FieldTypeString), gtly.NewField("income", gtly.FieldTypeFloat64), gtly.NewField("description", gtly.FieldTypeString, gtly.OmitEmptyOpt(true)), gtly.NewField("updated", gtly.FieldTypeTime, gtly.DateLayoutOpt(time.RFC3339)), gtly.NewField("numbers", gtly.FieldTypeArray, gtly.ComponentTypeOpt(gtly.FieldTypeInt)), ) if err != nil { log.Fatal(err) } fooArray1 := fooProvider.NewArray() setId := fooProvider.Mutator("id") setIncome := fooProvider.Mutator("income") setFirstName := fooProvider.Mutator("firsName") for i := 0; i < 10; i++ { foo1 := fooProvider.NewObject() setId.Int(foo1, 1) setIncome.Float64(foo1, 64000.0*float64(1+(10/(i+1)))) setFirstName.String(foo1, "Adam") fooArray1.AddObject(foo1) } now := time.Now() fooArray1.Add(map[string]interface{}{ "id": 100, "firsName": "Tom", "updated": now, }) totalIncome := 0.0 incomeField := fooProvider.Proto.Accessor("income") //Iterating collection err = fooArray1.Objects(func(object *gtly.Object) (bool, error) { fmt.Printf("id: %v\n", object.Value("id")) fmt.Printf("name: %v\n", object.Value("name")) value := incomeField.Float64(object) totalIncome += value return true, nil }) fmt.Printf("income total: %v\n", totalIncome) if err != nil { log.Fatal(err) } JSON, err := json.Marshal(fooArray1) if err != nil { log.Fatal(err) } fmt.Printf("%s", JSON) }
Output:
func (*Provider) NewMap ¶
func (p *Provider) NewMap(keyProvider KeyProvider) *Map
NewMap creates a map of string and object
Example ¶
ExampleProvider_NewMap new map example
package main import ( "fmt" "github.com/viant/gtly" "github.com/viant/gtly/codec/json" "log" "time" ) func main() { fooProvider, err := gtly.NewProvider("foo", gtly.NewField("id", gtly.FieldTypeInt), gtly.NewField("firsName", gtly.FieldTypeString), gtly.NewField("description", gtly.FieldTypeString, gtly.OmitEmptyOpt(true)), gtly.NewField("updated", gtly.FieldTypeTime, gtly.DateLayoutOpt(time.RFC3339)), gtly.NewField("numbers", gtly.FieldTypeArray, gtly.ComponentTypeOpt(gtly.FieldTypeInt)), ) if err != nil { log.Fatal(err) } //Creates a map keyed by id Field aMap := fooProvider.NewMap(gtly.NewKeyProvider("id")) for i := 0; i < 10; i++ { foo := fooProvider.NewObject() foo.SetValue("id", i) foo.SetValue("firsName", fmt.Sprintf("Name %v", i)) aMap.AddObject(foo) } //Accessing map foo1 := aMap.Object("1") JSON, err := json.Marshal(foo1) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", JSON) //Iterating map err = aMap.Pairs(func(key interface{}, item *gtly.Object) (bool, error) { fmt.Printf("id: %v\n", item.Value("id")) fmt.Printf("name: %v\n", item.Value("name")) return true, nil }) if err != nil { log.Fatal(err) } JSON, err = json.Marshal(aMap) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", JSON) //[{"id":1,"firsName":"Name 1","updated":null,"numbers":null},{"id":3,"firsName":"Name 3","updated":null,"numbers":null},{"id":4,"firsName":"Name 4","updated":null,"numbers":null},{"id":6,"firsName":"Name 6","updated":null,"numbers":null},{"id":8,"firsName":"Name 8","updated":null,"numbers":null},{"id":9,"firsName":"Name 9","updated":null,"numbers":null},{"id":0,"firsName":"Name 0","updated":null,"numbers":null},{"id":2,"firsName":"Name 2","updated":null,"numbers":null},{"id":5,"firsName":"Name 5","updated":null,"numbers":null},{"id":7,"firsName":"Name 7","updated":null,"numbers":null}] }
Output:
func (*Provider) NewMultimap ¶
func (p *Provider) NewMultimap(keyProvider KeyProvider) *Multimap
NewMultimap creates a multimap of string and slice
Example ¶
ExampleProvider_NewMulti new multi example
package main import ( "fmt" "github.com/viant/gtly" "github.com/viant/gtly/codec/json" "log" "time" ) func main() { fooProvider, err := gtly.NewProvider("foo", gtly.NewField("id", gtly.FieldTypeInt), gtly.NewField("firsName", gtly.FieldTypeString), gtly.NewField("city", gtly.FieldTypeString, gtly.OmitEmptyOpt(true)), gtly.NewField("updated", gtly.FieldTypeTime, gtly.DateLayoutOpt(time.RFC3339)), gtly.NewField("numbers", gtly.FieldTypeArray, gtly.ComponentTypeOpt(gtly.FieldTypeInt)), ) if err != nil { log.Fatal(err) } //Creates a multi map keyed by id Field aMap := fooProvider.NewMultimap(gtly.NewKeyProvider("city")) for i := 0; i < 10; i++ { foo := fooProvider.NewObject() foo.SetValue("id", i) foo.SetValue("firsName", fmt.Sprintf("Name %v", i)) if i%2 == 0 { foo.SetValue("city", "Cracow") } else { foo.SetValue("city", "Warsaw") } aMap.AddObject(foo) } //Accessing map fooInWarsawSlice := aMap.Slice("Warsaw") JSON, err := json.Marshal(fooInWarsawSlice) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", JSON) //Prints [{"id":1,"firsName":"Name 1","city":"Warsaw","updated":null,"numbers":null},{"id":3,"firsName":"Name 3","city":"Warsaw","updated":null,"numbers":null},{"id":5,"firsName":"Name 5","city":"Warsaw","updated":null,"numbers":null},{"id":7,"firsName":"Name 7","city":"Warsaw","updated":null,"numbers":null},{"id":9,"firsName":"Name 9","city":"Warsaw","updated":null,"numbers":null}] //Iterating multi map err = aMap.Slices(func(key interface{}, value *gtly.Array) (bool, error) { fmt.Printf("%v -> %v\n", key, value.Size()) return true, nil }) if err != nil { log.Fatal(err) } JSON, err = json.Marshal(aMap) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", JSON) //[{"id":0,"firsName":"Name 0","city":"Cracow","updated":null,"numbers":null},{"id":2,"firsName":"Name 2","city":"Cracow","updated":null,"numbers":null},{"id":4,"firsName":"Name 4","city":"Cracow","updated":null,"numbers":null},{"id":6,"firsName":"Name 6","city":"Cracow","updated":null,"numbers":null},{"id":8,"firsName":"Name 8","city":"Cracow","updated":null,"numbers":null},{"id":1,"firsName":"Name 1","city":"Warsaw","updated":null,"numbers":null},{"id":3,"firsName":"Name 3","city":"Warsaw","updated":null,"numbers":null},{"id":5,"firsName":"Name 5","city":"Warsaw","updated":null,"numbers":null},{"id":7,"firsName":"Name 7","city":"Warsaw","updated":null,"numbers":null},{"id":9,"firsName":"Name 9","city":"Warsaw","updated":null,"numbers":null}] }
Output:
func (*Provider) NewObject ¶
NewObject creates an object
Example ¶
ExampleProvider_NewObject new object example
package main import ( "fmt" "github.com/viant/gtly" "github.com/viant/gtly/codec/json" "github.com/viant/toolbox/format" "log" "time" ) func main() { fooProvider, err := gtly.NewProvider("foo", gtly.NewField("id", gtly.FieldTypeInt), gtly.NewField("firsName", gtly.FieldTypeString), gtly.NewField("description", gtly.FieldTypeString, gtly.OmitEmptyOpt(true)), gtly.NewField("updated", gtly.FieldTypeTime, gtly.DateLayoutOpt("2006-01-02T15:04:05Z07:00")), gtly.NewField("numbers", gtly.FieldTypeArray, gtly.ComponentTypeOpt(gtly.FieldTypeInt)), ) if err != nil { log.Fatal(err) } foo1 := fooProvider.NewObject() foo1.SetValue("id", 1) foo1.SetValue("firsName", "Adam") foo1.SetValue("updated", time.Now()) foo1.SetValue("numbers", []int{1, 2, 3}) JSON, err := json.Marshal(foo1) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", JSON) fooProvider.OutputCaseFormat(format.CaseLower, format.CaseUpperUnderscore) JSON, _ = json.Marshal(foo1) fmt.Printf("%s\n", JSON) fooProvider.OutputCaseFormat(format.CaseLower, format.CaseLowerUnderscore) foo1.SetValue("active", true) foo1.SetValue("description", "some description") JSON, _ = json.Marshal(foo1) fmt.Printf("%s\n", JSON) }
Output: