From 55007e2b237e7d7344d59400c7d289a124148091 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 | 33 +++++++++++++++++++++++++++++++++ reflection/scan.go | 5 +++++ 2 files changed, 38 insertions(+) create mode 100644 reflection/scan.go diff --git a/reflection/reflection.go b/reflection/reflection.go index 725c207..7b401af 100644 --- a/reflection/reflection.go +++ b/reflection/reflection.go @@ -1,2 +1,35 @@ // 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 { + v reflect.Value +} + +// Value returns the object it reflects +func (r *Reflection[T]) Value() *T { + return r.v.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]{ + v: reflect.ValueOf(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 +}