structproto

package module
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 14, 2025 License: MIT Imports: 5 Imported by: 5

README

structproto - StructPrototype

Go Reference Go Report Card

A high-performance Go library for binding data to structs using reflection with configurable field mapping and type conversion.

Features

  • High Performance: Optimized reflection usage with pre-allocated maps and efficient search algorithms
  • Flexible Binding: Support for maps, slices, channels, and custom iterators
  • Configurable Tags: Custom struct tags for field mapping and validation
  • Type Safety: Built-in type conversion with comprehensive error handling
  • Multiple Sources: Bind from various data sources with unified interface
  • Required Fields: Built-in validation for required field checking

Installation

go get github.com/Bofry/structproto

Quick Start

Binding struct from map
import (
  "fmt"
  "time"

  "github.com/Bofry/structproto"
  "github.com/Bofry/structproto/valuebinder"
)


type Character struct {
  Name        string    `demo:"*NAME"`
  Age         *int      `demo:"*AGE"`
  Alias       []string  `demo:"ALIAS"`
  DateOfBirth time.Time `demo:"DATE_OF_BIRTH;the character's birth of date"`
  Remark      string    `demo:"REMARK;note the character's personal favor"`
}

func main() {
  c := Character{}
  prototype, err := structproto.Prototypify(&c,
    &structproto.StructProtoResolveOption{
      TagName: "demo",
    })
  if err != nil {
    panic(err)
  }
  
  err = prototype.BindMap(map[string]interface{}{
    "NAME":          "luffy",
    "AGE":           "19",
    "ALIAS":         "lucy",
    "DATE_OF_BIRTH": "2020-05-05T00:00:00Z",
  }, valuebinder.BuildStringArgsBinder)
  if err != nil {
    panic(err)
  }
  fmt.Printf("Name       : %q\n", c.Name)
  fmt.Printf("Age        : %d\n", *c.Age)
  fmt.Printf("Alias      : %q\n", c.Alias)
  fmt.Printf("DateOfBirth: %q\n", c.DateOfBirth)
  fmt.Printf("Remark     : %q\n", c.Remark)
  // Output:
  // Name       : "luffy"
  // Age        : 19
  // Alias      : ["lucy"]
  // DateOfBirth: "2020-05-05 00:00:00 +0000 UTC"
  // Remark     : ""
}
Binding struct from structproto.FieldValueMap
import (
  "fmt"
  "time"

  "github.com/Bofry/structproto"
  "github.com/Bofry/structproto/valuebinder"
)


type Character struct {
  Name        string    `demo:"*NAME"`
  Age         *int      `demo:"*AGE"`
  Alias       []string  `demo:"ALIAS"`
  DateOfBirth time.Time `demo:"DATE_OF_BIRTH;the character's birth of date"`
  Remark      string    `demo:"REMARK;note the character's personal favor"`
}

func main() {
  c := Character{}
  prototype, err := structproto.Prototypify(&c,
    &structproto.StructProtoResolveOption{
      TagName: "demo",
    })
  if err != nil {
    panic(err)
  }
  
  err = prototype.BindMap(structproto.FieldValueMap{
    "NAME":          "luffy",
    "AGE":           "19",
    "ALIAS":         "lucy",
    "DATE_OF_BIRTH": "2020-05-05T00:00:00Z",
  }, valuebinder.BuildStringArgsBinder)
  if err != nil {
    panic(err)
  }
  fmt.Printf("Name       : %q\n", c.Name)
  fmt.Printf("Age        : %d\n", *c.Age)
  fmt.Printf("Alias      : %q\n", c.Alias)
  fmt.Printf("DateOfBirth: %q\n", c.DateOfBirth)
  fmt.Printf("Remark     : %q\n", c.Remark)
  // Output:
  // Name       : "luffy"
  // Age        : 19
  // Alias      : ["lucy"]
  // DateOfBirth: "2020-05-05 00:00:00 +0000 UTC"
  // Remark     : ""
}
Binding struct by FieldValueEntity slice
import (
  "fmt"
  "time"

  "github.com/Bofry/structproto"
  "github.com/Bofry/structproto/valuebinder"
)


type Character struct {
  Name        string    `demo:"*NAME"`
  Age         *int      `demo:"*AGE"`
  Alias       []string  `demo:"ALIAS"`
  DateOfBirth time.Time `demo:"DATE_OF_BIRTH;the character's birth of date"`
  Remark      string    `demo:"REMARK;note the character's personal favor"`
}

type FieldValue struct {
  Name  string
  Value string
}

func main() {
  c := Character{}
  prototype, err := structproto.Prototypify(&c,
    &structproto.StructProtoResolveOption{
      TagName: "demo",
    })
  if err != nil {
    panic(err)
  }
  
  err = prototype.BindFields([]structproto.FieldValueEntity{
  {Field: "NAME", Value: "luffy"},
  {Field: "AGE", Value: "19"},
  {Field: "ALIAS", Value: "lucy"},
  {Field: "DATE_OF_BIRTH", Value: "2020-05-05T00:00:00Z"},
  }, valuebinder.BuildStringArgsBinder)
  if err != nil {
    panic(err)
  }
  fmt.Printf("Name       : %q\n", c.Name)
  fmt.Printf("Age        : %d\n", *c.Age)
  fmt.Printf("Alias      : %q\n", c.Alias)
  fmt.Printf("DateOfBirth: %q\n", c.DateOfBirth)
  fmt.Printf("Remark     : %q\n", c.Remark)
  // Output:
  // Name       : "luffy"
  // Age        : 19
  // Alias      : ["lucy"]
  // DateOfBirth: "2020-05-05 00:00:00 +0000 UTC"
  // Remark     : ""
}
Binding struct by channel iterator
import (
  "fmt"
  "time"

  "github.com/Bofry/structproto"
  "github.com/Bofry/structproto/valuebinder"
)


type Character struct {
  Name        string    `demo:"*NAME"`
  Age         *int      `demo:"*AGE"`
  Alias       []string  `demo:"ALIAS"`
  DateOfBirth time.Time `demo:"DATE_OF_BIRTH;the character's birth of date"`
  Remark      string    `demo:"REMARK;note the character's personal favor"`
}

type FieldValue struct {
  Name  string
  Value string
}

func main() {
  c := Character{}
  prototype, err := structproto.Prototypify(&c,
    &structproto.StructProtoResolveOption{
      TagName: "demo",
    })
  if err != nil {
    panic(err)
  }
  
  err = prototype.BindChan(func() <-chan structproto.FieldValueEntity {
    c := make(chan structproto.FieldValueEntity, 1)
    go func() {
      for _, v := range fieldValues {
        c <- v
      }
      close(c)
    }()
    return c
  }(), valuebinder.BuildStringArgsBinder)
  if err != nil {
    panic(err)
  }
  fmt.Printf("Name       : %q\n", c.Name)
  fmt.Printf("Age        : %d\n", *c.Age)
  fmt.Printf("Alias      : %q\n", c.Alias)
  fmt.Printf("DateOfBirth: %q\n", c.DateOfBirth)
  fmt.Printf("Remark     : %q\n", c.Remark)
  // Output:
  // Name       : "luffy"
  // Age        : 19
  // Alias      : ["lucy"]
  // DateOfBirth: "2020-05-05 00:00:00 +0000 UTC"
  // Remark     : ""
}
Binding struct by custom structproto.Iterator
import (
  "fmt"
  "time"

  "github.com/Bofry/structproto"
  "github.com/Bofry/structproto/valuebinder"
)


type Character struct {
  Name        string    `demo:"*NAME"`
  Age         *int      `demo:"*AGE"`
  Alias       []string  `demo:"ALIAS"`
  DateOfBirth time.Time `demo:"DATE_OF_BIRTH;the character's birth of date"`
  Remark      string    `demo:"REMARK;note the character's personal favor"`
}

var _ structproto.Iterator = EntitySet(nil)

type EntitySet [][]string

func (set EntitySet) Iterate() <-chan structproto.FieldValueEntity {
 c := make(chan structproto.FieldValueEntity, 1)
 go func() {
  for _, v := range set {
   c <- structproto.FieldValueEntity{
    Field: v[0],
    Value: v[1],
   }
  }
  close(c)
 }()
 return c
}

func main() {
  c := Character{}
  prototype, err := structproto.Prototypify(&c,
    &structproto.StructProtoResolveOption{
      TagName: "demo",
    })
  if err != nil {
    panic(err)
  }
  
  err = prototype.BindIterator(EntitySet{
  {"NAME", "luffy"},
  {"AGE", "19"},
  {"ALIAS", "lucy"},
  {"DATE_OF_BIRTH", "2020-05-05T00:00:00Z"},
  {"NUMBERS", "5,12"},
 }, valuebinder.BuildStringArgsBinder)
  if err != nil {
    panic(err)
  }
  fmt.Printf("Name       : %q\n", c.Name)
  fmt.Printf("Age        : %d\n", *c.Age)
  fmt.Printf("Alias      : %q\n", c.Alias)
  fmt.Printf("DateOfBirth: %q\n", c.DateOfBirth)
  fmt.Printf("Remark     : %q\n", c.Remark)
  // Output:
  // Name       : "luffy"
  // Age        : 19
  // Alias      : ["lucy"]
  // DateOfBirth: "2020-05-05 00:00:00 +0000 UTC"
  // Remark     : ""
}
Binding struct by custom StructBinder
import (
  "fmt"
  "time"

  "github.com/Bofry/structproto"
  "github.com/Bofry/structproto/valuebinder"
)


type Character struct {
  Name        string    `demo:"*NAME"`
  Age         *int      `demo:"*AGE"`
  Alias       []string  `demo:"ALIAS"`
  DateOfBirth time.Time `demo:"DATE_OF_BIRTH;the character's birth of date"`
  Remark      string    `demo:"REMARK;note the character's personal favor"`
}

type MapBinder struct {
  values map[string]string
}

func (b *MapBinder) Init(context *StructProtoContext) error {
  return nil
}

func (b *MapBinder) Bind(field FieldInfo, rv reflect.Value) error {
  name := field.Name()
  if v, ok := b.values[name]; ok {
    return valuebinder.StringArgsBinder(rv).Bind(v)
  }
  return nil
}

func (b *MapBinder) Deinit(context *StructProtoContext) error {
  // validate missing required fields
  return context.CheckIfMissingRequiredFields(func() <-chan string {
    c := make(chan string)
    go func() {
      for k := range b.values {
        c <- k
      }
      close(c)
    }()
    return c
  })
}

func main() {
  c := Character{}
  prototype, err := structproto.Prototypify(&c,
    &structproto.StructProtoResolveOption{
      TagName: "demo",
    })
  if err != nil {
    panic(err)
  }
  
  binder := &MapBinder{
    values: map[string]string{
      "NAME":          "luffy",
      "AGE":           "19",
      "ALIAS":         "lucy",
      "DATE_OF_BIRTH": "2020-05-05T00:00:00Z",
    },
  }

  err = prototype.Bind(binder)
  if err != nil {
    panic(err)
  }
  fmt.Printf("Name       : %q\n", c.Name)
  fmt.Printf("Age        : %d\n", *c.Age)
  fmt.Printf("Alias      : %q\n", c.Alias)
  fmt.Printf("DateOfBirth: %q\n", c.DateOfBirth)
  fmt.Printf("Remark     : %q\n", c.Remark)
  // Output:
  // Name       : "luffy"
  // Age        : 19
  // Alias      : ["lucy"]
  // DateOfBirth: "2020-05-05 00:00:00 +0000 UTC"
  // Remark     : ""
}

API Reference

Core Types
StructProtoResolver

The main resolver for creating struct prototypes.

type StructProtoResolver struct {
    // Configuration fields
}

func NewStructProtoResolver(option *StructProtoResolveOption) *StructProtoResolver
func (r *StructProtoResolver) Resolve(target interface{}) (*Struct, error)
Struct

Represents a resolved struct prototype with binding capabilities.

type Struct struct {
    // Internal fields
}

// Binding methods
func (s *Struct) BindMap(values map[string]interface{}, buildValueBinder ValueBindProvider) error
func (s *Struct) BindFields(values []FieldValueEntity, buildValueBinder ValueBindProvider) error
func (s *Struct) BindChan(iterator <-chan FieldValueEntity, buildValueBinder ValueBindProvider) error
func (s *Struct) BindIterator(iterator Iterator, buildValueBinder ValueBindProvider) error
func (s *Struct) Bind(binder StructBinder) error
func (s *Struct) Map(mapper StructMapper) error
func (s *Struct) Visit(visitor StructVisitor)
Configuration Options
type StructProtoResolveOption struct {
    TagName             string      // Custom tag name for field mapping
    TagResolver         TagResolver // Custom tag resolution logic
    CheckDuplicateNames bool        // Enable duplicate field name checking
}
Tag Syntax

Fields can be configured using struct tags:

type Example struct {
    RequiredField string `demo:"*FIELD_NAME"`           // Required field
    OptionalField string `demo:"FIELD_NAME"`            // Optional field
    WithDesc      string `demo:"FIELD;description here"` // Field with description
}
  • * prefix marks required fields
  • ; separates field name from description

Performance

This library has been optimized for high-performance scenarios:

  • Pre-allocated Maps: Reduces memory allocations during struct initialization
  • Efficient Search: Optimized binary search for field lookups
  • Minimal Goroutines: Eliminates unnecessary concurrency overhead
  • Reflection Caching: Reuses reflection metadata where possible
Benchmarks
// Run benchmarks
go test -bench=. -benchmem

Requirements

  • Go 1.21 or later
  • No external dependencies (except for testing)

Testing

# Run all tests
go test ./...

# Run with coverage
go test -cover ./...

# Run specific package tests
go test ./valuebinder -v

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes
  4. Add tests for your changes
  5. Ensure all tests pass (go test ./...)
  6. Run linting (go fmt ./... && go vet ./...)
  7. Commit your changes (git commit -am 'Add amazing feature')
  8. Push to the branch (git push origin feature/amazing-feature)
  9. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Examples

For more comprehensive examples, check out the example_test.go file.

Documentation

Index

Examples

Constants

View Source
const (
	RequiredFlag = common.RequiredFlag
	BlankFlag    = common.BlankFlag
)

Variables

This section is empty.

Functions

This section is empty.

Types

type FieldBindingError

type FieldBindingError struct {
	Field string
	Value interface{}
	Err   error
}

func (*FieldBindingError) Error

func (e *FieldBindingError) Error() string

func (*FieldBindingError) Unwrap

func (e *FieldBindingError) Unwrap() error

Unwrap returns the underlying error.

type FieldFlagSet

type FieldFlagSet []string

type FieldInfo

type FieldInfo interface {
	IDName() string
	Name() string
	Desc() string
	Index() int
	FindFlag(predicate func(v string) bool) bool
	HasFlag(v string) bool
	Tag() reflect.StructTag
}

type FieldInfoImpl

type FieldInfoImpl struct {
	// contains filtered or unexported fields
}

func (*FieldInfoImpl) Desc

func (f *FieldInfoImpl) Desc() string

Desc implements FieldInfo.

func (*FieldInfoImpl) FindFlag

func (f *FieldInfoImpl) FindFlag(predicate func(v string) bool) bool

FindFlag implements FieldInfo.

func (*FieldInfoImpl) HasFlag

func (f *FieldInfoImpl) HasFlag(v string) bool

HasFlag implements FieldInfo.

func (*FieldInfoImpl) IDName

func (f *FieldInfoImpl) IDName() string

IDName implements FieldInfo.

func (*FieldInfoImpl) Index

func (f *FieldInfoImpl) Index() int

Index implements FieldInfo.

func (*FieldInfoImpl) Name

func (f *FieldInfoImpl) Name() string

Name implements FieldInfo.

func (*FieldInfoImpl) Tag

func (f *FieldInfoImpl) Tag() reflect.StructTag

Tag implements FieldInfo.

type FieldValueEntity

type FieldValueEntity struct {
	Field string
	Value interface{}
}

type FieldValueMap

type FieldValueMap map[string]interface{}
Example
package main

import (
	"fmt"
	"time"

	"github.com/Bofry/structproto"
	"github.com/Bofry/structproto/valuebinder"
)

func main() {
	s := struct {
		Name        string    `demo:"*NAME"`
		Age         *int      `demo:"*AGE"`
		Alias       []string  `demo:"ALIAS"`
		DateOfBirth time.Time `demo:"DATE_OF_BIRTH;the character's birth of date"`
		Remark      string    `demo:"REMARK;note the character's personal favor"`
	}{}
	prototype, err := structproto.Prototypify(&s,
		&structproto.StructProtoResolveOption{
			TagName: "demo",
		})
	if err != nil {
		panic(err)
	}

	err = prototype.BindMap(structproto.FieldValueMap{
		"NAME":          "luffy",
		"AGE":           "19",
		"ALIAS":         "lucy",
		"DATE_OF_BIRTH": "2020-05-05T00:00:00Z",
	}, valuebinder.BuildStringBinder)
	if err != nil {
		panic(err)
	}
	fmt.Printf("Name       : %q\n", s.Name)
	fmt.Printf("Age        : %d\n", *s.Age)
	fmt.Printf("Alias      : %q\n", s.Alias)
	fmt.Printf("DateOfBirth: %q\n", s.DateOfBirth)
	fmt.Printf("Remark     : %q\n", s.Remark)
}
Output:

Name       : "luffy"
Age        : 19
Alias      : ["lucy"]
DateOfBirth: "2020-05-05 00:00:00 +0000 UTC"
Remark     : ""

func (FieldValueMap) Iterate

func (values FieldValueMap) Iterate() <-chan FieldValueEntity

type FunctionStructBinder added in v0.2.1

type FunctionStructBinder struct {
	// contains filtered or unexported fields
}

func (*FunctionStructBinder) Bind added in v0.2.1

func (binder *FunctionStructBinder) Bind(field FieldInfo, rv reflect.Value) error

Bind implements StructBinder.

func (*FunctionStructBinder) Deinit added in v0.2.1

func (binder *FunctionStructBinder) Deinit(context *StructProtoContext) error

Deinit implements StructBinder.

func (*FunctionStructBinder) Init added in v0.2.1

func (binder *FunctionStructBinder) Init(context *StructProtoContext) error

Init implements StructBinder.

type Iterator

type Iterator interface {
	Iterate() <-chan FieldValueEntity
}

type MissingRequiredFieldError

type MissingRequiredFieldError struct {
	Field string
	Err   error
}

A MissingRequiredFieldError represents an error when the required fields cannot be binded or missing.

func (*MissingRequiredFieldError) Error

func (e *MissingRequiredFieldError) Error() string

func (*MissingRequiredFieldError) Unwrap

func (e *MissingRequiredFieldError) Unwrap() error

Unwrap returns the underlying error.

type Struct

type Struct struct {
	// contains filtered or unexported fields
}

func Prototypify

func Prototypify(target interface{}, option *StructProtoResolveOption) (*Struct, error)
Example
package main

import (
	"fmt"
	"time"

	"github.com/Bofry/structproto"
	"github.com/Bofry/structproto/valuebinder"
)

func main() {
	s := struct {
		Name        string    `demo:"*NAME"`
		Age         *int      `demo:"*AGE"`
		Alias       []string  `demo:"ALIAS"`
		DateOfBirth time.Time `demo:"DATE_OF_BIRTH;the character's birth of date"`
		Remark      string    `demo:"REMARK;note the character's personal favor"`
	}{}
	prototype, err := structproto.Prototypify(&s,
		&structproto.StructProtoResolveOption{
			TagName: "demo",
		})
	if err != nil {
		panic(err)
	}

	err = prototype.BindMap(map[string]interface{}{
		"NAME":          "luffy",
		"AGE":           "19",
		"ALIAS":         "lucy",
		"DATE_OF_BIRTH": "2020-05-05T00:00:00Z",
	}, valuebinder.BuildStringBinder)
	if err != nil {
		panic(err)
	}
	fmt.Printf("Name       : %q\n", s.Name)
	fmt.Printf("Age        : %d\n", *s.Age)
	fmt.Printf("Alias      : %q\n", s.Alias)
	fmt.Printf("DateOfBirth: %q\n", s.DateOfBirth)
	fmt.Printf("Remark     : %q\n", s.Remark)
}
Output:

Name       : "luffy"
Age        : 19
Alias      : ["lucy"]
DateOfBirth: "2020-05-05 00:00:00 +0000 UTC"
Remark     : ""

func (*Struct) Bind

func (s *Struct) Bind(binder StructBinder) error

func (*Struct) BindChan

func (s *Struct) BindChan(iterator <-chan FieldValueEntity, buildValueBinder ValueBindProvider) error

func (*Struct) BindFields

func (s *Struct) BindFields(values []FieldValueEntity, buildValueBinder ValueBindProvider) error
Example
package main

import (
	"fmt"
	"time"

	"github.com/Bofry/structproto"
	"github.com/Bofry/structproto/valuebinder"
)

func main() {
	s := struct {
		Name        string    `demo:"*NAME"`
		Age         *int      `demo:"*AGE"`
		Alias       []string  `demo:"ALIAS"`
		DateOfBirth time.Time `demo:"DATE_OF_BIRTH;the character's birth of date"`
		Remark      string    `demo:"REMARK;note the character's personal favor"`
	}{}
	prototype, err := structproto.Prototypify(&s,
		&structproto.StructProtoResolveOption{
			TagName: "demo",
		})
	if err != nil {
		panic(err)
	}

	fieldValues := []structproto.FieldValueEntity{
		{Field: "NAME", Value: "luffy"},
		{Field: "AGE", Value: "19"},
		{Field: "ALIAS", Value: "lucy"},
		{Field: "DATE_OF_BIRTH", Value: "2020-05-05T00:00:00Z"},
	}

	err = prototype.BindFields(fieldValues, valuebinder.BuildStringBinder)
	if err != nil {
		panic(err)
	}
	fmt.Printf("Name       : %q\n", s.Name)
	fmt.Printf("Age        : %d\n", *s.Age)
	fmt.Printf("Alias      : %q\n", s.Alias)
	fmt.Printf("DateOfBirth: %q\n", s.DateOfBirth)
	fmt.Printf("Remark     : %q\n", s.Remark)
}
Output:

Name       : "luffy"
Age        : 19
Alias      : ["lucy"]
DateOfBirth: "2020-05-05 00:00:00 +0000 UTC"
Remark     : ""

func (*Struct) BindIterator

func (s *Struct) BindIterator(iterator Iterator, buildValueBinder ValueBindProvider) error

func (*Struct) BindMap

func (s *Struct) BindMap(values map[string]interface{}, buildValueBinder ValueBindProvider) error
Example
package main

import (
	"fmt"
	"time"

	"github.com/Bofry/structproto"
	"github.com/Bofry/structproto/valuebinder"
)

func main() {
	s := struct {
		Name        string    `demo:"*NAME"`
		Age         *int      `demo:"*AGE"`
		Alias       []string  `demo:"ALIAS"`
		DateOfBirth time.Time `demo:"DATE_OF_BIRTH;the character's birth of date"`
		Remark      string    `demo:"REMARK;note the character's personal favor"`
	}{}
	prototype, err := structproto.Prototypify(&s,
		&structproto.StructProtoResolveOption{
			TagName: "demo",
		})
	if err != nil {
		panic(err)
	}

	err = prototype.BindMap(map[string]interface{}{
		"NAME":          "luffy",
		"AGE":           "19",
		"ALIAS":         "lucy",
		"DATE_OF_BIRTH": "2020-05-05T00:00:00Z",
	}, valuebinder.BuildStringBinder)
	if err != nil {
		panic(err)
	}
	fmt.Printf("Name       : %q\n", s.Name)
	fmt.Printf("Age        : %d\n", *s.Age)
	fmt.Printf("Alias      : %q\n", s.Alias)
	fmt.Printf("DateOfBirth: %q\n", s.DateOfBirth)
	fmt.Printf("Remark     : %q\n", s.Remark)
}
Output:

Name       : "luffy"
Age        : 19
Alias      : ["lucy"]
DateOfBirth: "2020-05-05 00:00:00 +0000 UTC"
Remark     : ""

func (*Struct) Map added in v0.2.1

func (s *Struct) Map(mapper StructMapper) error

func (*Struct) Visit

func (s *Struct) Visit(visitor StructVisitor)

type StructBinder

type StructBinder interface {
	Init(context *StructProtoContext) error
	Bind(field FieldInfo, rv reflect.Value) error
	Deinit(context *StructProtoContext) error
}

type StructMapper added in v0.2.1

type StructMapper func(field FieldInfo, rv reflect.Value) error

type StructProtoContext

type StructProtoContext Struct

func (*StructProtoContext) CheckIfMissingRequiredFields

func (ctx *StructProtoContext) CheckIfMissingRequiredFields(visitFieldProc func() <-chan string) error

func (*StructProtoContext) Field

func (ctx *StructProtoContext) Field(name string) (v reflect.Value, ok bool)

func (*StructProtoContext) FieldInfo

func (ctx *StructProtoContext) FieldInfo(name string) FieldInfo

func (*StructProtoContext) FieldNames

func (ctx *StructProtoContext) FieldNames() []string

func (*StructProtoContext) IsRequired

func (ctx *StructProtoContext) IsRequired(name string) bool

func (*StructProtoContext) RequiredFields

func (ctx *StructProtoContext) RequiredFields() []string

func (*StructProtoContext) Target

func (ctx *StructProtoContext) Target() reflect.Value

type StructProtoResolveOption

type StructProtoResolveOption struct {
	TagName             string
	TagResolver         TagResolver
	CheckDuplicateNames bool
}

type StructProtoResolver

type StructProtoResolver struct {
	// contains filtered or unexported fields
}

func NewStructProtoResolver

func NewStructProtoResolver(option *StructProtoResolveOption) *StructProtoResolver

func (*StructProtoResolver) Resolve

func (r *StructProtoResolver) Resolve(target interface{}) (*Struct, error)

type StructVisitor

type StructVisitor func(name string, rv reflect.Value, info FieldInfo)

type Tag

type Tag = common.Tag

type TagResolver

type TagResolver = common.TagResolver

type Unmarshaler added in v0.2.2

type Unmarshaler = common.Unmarshaler

type ValueBindProvider

type ValueBindProvider = common.ValueBindProvider

type ValueBinder

type ValueBinder = common.ValueBinder

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL