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 ValidateCaseFormat(caseFormat string) error
- func Value(value interface{}) interface{}
- type Array
- func (s *Array) Add(aMap map[string]interface{})
- func (s *Array) AddObject(object *Object)
- func (s Array) Compact() *Compacted
- func (s Array) First() *Object
- func (s *Array) Objects(handler func(item *Object) (bool, error)) error
- func (s *Array) Proto() *Proto
- func (s Array) Range(handler func(item interface{}) (bool, error)) error
- func (s Array) Size() int
- type Collection
- type Compacted
- type Field
- func (f *Field) Get(values []interface{}) interface{}
- func (f *Field) InitType(value interface{})
- func (f *Field) IsEmpty(proto *Proto, value interface{}) bool
- func (f *Field) OutputName() string
- func (f *Field) Set(value interface{}, result *[]interface{})
- func (f *Field) SetProvider(provider *Provider)
- func (f *Field) SetValue(value interface{}, result *[]interface{})
- func (f *Field) ShallOmitEmpty(proto *Proto) bool
- func (f *Field) TimeLayout(proto *Proto) string
- type Index
- type Map
- func (m *Map) Add(values map[string]interface{})
- func (m *Map) AddObject(object *Object)
- func (m Map) Compact() *Compacted
- func (m Map) First() *Object
- func (m *Map) Object(key string) *Object
- func (m *Map) Objects(handler func(item *Object) (bool, error)) error
- func (m *Map) Pairs(handler func(key string, item *Object) (bool, error)) error
- func (m *Map) Proto() *Proto
- 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{})
- func (m *Multimap) AddObject(object *Object)
- func (m Multimap) Compact() *Compacted
- 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 string, value *Array) (bool, error)) error
- type Nilable
- type Object
- func (o *Object) AsMap() map[string]interface{}
- func (o *Object) Bool(name string) bool
- func (o *Object) BoolAt(index int) bool
- func (o *Object) Float(name string) float64
- func (o *Object) FloatAt(index int) float64
- func (o *Object) FloatValue(name string) (*float64, error)
- func (o *Object) HasAt(index int) bool
- func (o *Object) Init(values map[string]interface{})
- func (o *Object) Int(name string) int
- func (o *Object) IntAt(index int) int
- func (o *Object) IntValue(name string) (*int, error)
- func (o *Object) IsNil() bool
- func (o *Object) Proto() *Proto
- func (o *Object) SetBool(name string, value bool)
- func (o *Object) SetFloat(name string, value float64)
- func (o *Object) SetInt(name string, value int)
- func (o *Object) SetString(name string, value string)
- func (o *Object) SetTime(name string, value time.Time)
- func (o *Object) SetValue(name string, value interface{})
- func (o *Object) String(name string) string
- func (o *Object) StringAt(index int) string
- func (o *Object) StringValue(name string) *string
- func (o *Object) Value(name string) interface{}
- func (o *Object) ValueAt(index int) interface{}
- type Option
- type Proto
- func (p *Proto) AddField(field *Field) *Field
- func (p *Proto) Field(name string) *Field
- func (p *Proto) FieldWithValue(fieldName string, value interface{}) *Field
- func (p *Proto) Fields() []*Field
- func (p *Proto) Hide(name string)
- func (p *Proto) InputCaseFormat(source, input string) error
- func (p *Proto) Object(values []interface{}) (*Object, error)
- func (p *Proto) OutputCaseFormat(source, output string) 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
- type Provider
- type Zeroable
Examples ¶
Constants ¶
const ( //CaseUpper upper case CaseUpper = "Upper" //CaseLower lower case CaseLower = "Lower" //CaseUpperCamel upper camel CaseUpperCamel = "UpperCamel" //CaseLowerCamel lower camel CaseLowerCamel = "LowerCamel" //CaseUpperUnderscore upper underscore CaseUpperUnderscore = "UpperUnderscore" //CaseLowerUnderscore lower underscore CaseLowerUnderscore = "LowerUnderscore" )
const ( //FieldTypeInt int type FieldTypeInt = "int" //FieldTypeFloat float type FieldTypeFloat = "float" //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 CaseFormat = map[string]int{ CaseUpper: toolbox.CaseUpper, CaseLower: toolbox.CaseLower, CaseUpperCamel: toolbox.CaseUpperCamel, CaseLowerCamel: toolbox.CaseLowerCamel, CaseUpperUnderscore: toolbox.CaseUpperUnderscore, CaseLowerUnderscore: toolbox.CaseLowerUnderscore, }
CaseFormat defines case format map
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 ¶
func ValidateCaseFormat ¶
ValidateCaseFormat checks if case format is valid
Types ¶
type Array ¶
type Array struct {
// contains filtered or unexported fields
}
Array represents dynamic object slice
func (*Array) Objects ¶
Objects iterate over object slice, any update to objects are applied to the slice
type Collection ¶
type Collection interface {
//Add adds item to collection
Add(values map[string]interface{})
//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
//Compact returns compacted collection representation
Compact() *Compacted
}
Collection represents generic collection
type Compacted ¶
type Compacted struct {
Fields []*Field
Data [][]interface{}
}
Compacted represents compacted collection
func (*Compacted) TransformBinary ¶
func (c *Compacted) TransformBinary()
TransformBinary transform binary data into string
func (Compacted) Update ¶
func (c Compacted) Update(collection Collection) error
Update updates collection
type Field ¶
type Field struct {
Name string `json:",omitempty"`
Index int
OmitEmpty *bool `json:",omitempty"`
DateFormat string `json:",omitempty"`
DataLayout string `json:",omitempty"`
DataType string `json:",omitempty"`
InputName string `json:",omitempty"`
ComponentType string `json:",omitempty"`
// contains filtered or unexported fields
}
Field represents dynamic filed
func (*Field) Set ¶
func (f *Field) Set(value interface{}, result *[]interface{})
Set sets a field value
func (*Field) SetProvider ¶
SetProvider set provider
func (*Field) SetValue ¶
func (f *Field) SetValue(value interface{}, result *[]interface{})
SetValue sets field value
func (*Field) ShallOmitEmpty ¶
ShallOmitEmpty return true if shall omit empty
func (*Field) TimeLayout ¶
TimeLayout returns timelayout
type Map ¶
type Map struct {
// contains filtered or unexported fields
}
Map represents generic map
func (*Map) Objects ¶
Objects iterate over object slice, any update to objects are applied to the slice
type Multimap ¶
type Multimap struct {
// contains filtered or unexported fields
}
Multimap represents generic multi map
type Object ¶
type Object struct {
// contains filtered or unexported fields
}
Object represents dynamic object
func (*Object) FloatValue ¶
FloatValue return float for supplied Name
func (*Object) StringValue ¶
StringValue returns int 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) FieldWithValue ¶
FieldWithValue returns existing filed , or create a new field
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 := gtly.NewProvider("foo",
gtly.NewField("id", gtly.FieldTypeInt),
gtly.NewField("firsName", gtly.FieldTypeString),
gtly.NewField("income", gtly.FieldTypeFloat),
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)),
)
fooArray1 := fooProvider.NewArray()
for i := 0; i < 10; i++ {
foo1 := fooProvider.NewObject()
foo1.SetInt("id", 1)
foo1.SetFloat("income", 64000.0*float64(1+(10/(i+1))))
foo1.SetString("firsName", "Adam")
fooArray1.AddObject(foo1)
}
now := time.Now()
fooArray1.Add(map[string]interface{}{
"id": 100,
"firsName": "Tom",
"updated": now,
})
totalIncome := 0.0
incomeField := fooProvider.Field("income")
//Iterating collection
err := fooArray1.Objects(func(object *gtly.Object) (bool, error) {
fmt.Printf("id: %v\n", object.Int("id"))
fmt.Printf("name: %v\n", object.String("name"))
totalIncome += object.FloatAt(incomeField.Index)
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 ¶
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 := 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)),
)
//Creates a map keyed by id field
aMap := fooProvider.NewMap(gtly.NewIndex([]string{"id"}))
for i := 0; i < 10; i++ {
foo := fooProvider.NewObject()
foo.SetInt("id", i)
foo.SetString("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 string, item *gtly.Object) (bool, error) {
fmt.Printf("id: %v\n", item.Int("id"))
fmt.Printf("name: %v\n", item.String("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 ¶
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 := 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)),
)
//Creates a multi map keyed by id field
aMap := fooProvider.NewMultimap(gtly.NewIndex([]string{"city"}))
for i := 0; i < 10; i++ {
foo := fooProvider.NewObject()
foo.SetInt("id", i)
foo.SetString("firsName", fmt.Sprintf("Name %v", i))
if i%2 == 0 {
foo.SetString("city", "Cracow")
} else {
foo.SetString("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 string, 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"
"log"
"time"
)
func main() {
fooProvider := 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)),
)
foo1 := fooProvider.NewObject()
foo1.SetInt("id", 1)
foo1.SetString("firsName", "Adam")
foo1.SetTime("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(gtly.CaseLowerCamel, gtly.CaseUpperUnderscore)
JSON, _ = json.Marshal(foo1)
fmt.Printf("%s\n", JSON)
fooProvider.OutputCaseFormat(gtly.CaseLowerCamel, gtly.CaseLowerUnderscore)
foo1.SetBool("active", true)
foo1.SetString("description", "some description")
JSON, _ = json.Marshal(foo1)
fmt.Printf("%s\n", JSON)
}
Output: