From a2da12be7a8f1f1bf004b5b81d0532a76c954655 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Sat, 2 Sep 2023 00:00:12 +0000 Subject: [PATCH] reflection: add initial New() validating type and triggering a scan Signed-off-by: Alejandro Mery --- reflection/reflection.go | 34 ++++++++++++++++++++++++++++++++++ reflection/scan.go | 5 +++++ 2 files changed, 39 insertions(+) create mode 100644 reflection/scan.go diff --git a/reflection/reflection.go b/reflection/reflection.go index 725c207..fc18b93 100644 --- a/reflection/reflection.go +++ b/reflection/reflection.go @@ -1,2 +1,36 @@ // 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 +} diff --git a/reflection/scan.go b/reflection/scan.go new file mode 100644 index 0000000..9f67b90 --- /dev/null +++ b/reflection/scan.go @@ -0,0 +1,5 @@ +package reflection + +func (*Reflection[T]) scan() error { + return nil +}