// Package reflection helps Marshalling/Unmarshalling data to structs package reflection import ( "reflect" ) // Reflection provides Marshalling/Unmarshalling oriented view // of a value type Reflection[T any] struct { rv reflect.Value rt reflect.Type } // Value returns the object it reflects func (r *Reflection[T]) Value() *T { return r.rv.Interface().(*T) } // New creates a Reflection of the given pointer func New[T any](v *T) (*Reflection[T], error) { if v == nil { err := &InvalidUnmarshalError{Type: reflect.TypeOf(v)} return nil, err } r := &Reflection[T]{ rv: reflect.ValueOf(v), rt: reflect.TypeOf(v), } if err := r.scan(); err != nil { return nil, err } return r, nil }