Skip to content

Commit

Permalink
fix(core): add WriterFrom and WriterTo helpers.
Browse files Browse the repository at this point in the history
  • Loading branch information
moisespsena committed May 23, 2024
1 parent 76d46d0 commit 8d05747
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 14 deletions.
15 changes: 5 additions & 10 deletions builtins_funcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -838,13 +838,8 @@ func BuiltinReadFunc(c Call) (ret Object, err error) {
Name: "reader",
TypeAssertion: &TypeAssertion{
Handlers: map[string]TypeAssertionHandler{
"reader": func(v Object) bool {
switch v.(type) {
case Reader:
return true
default:
return false
}
"reader": func(v Object) (ok bool) {
return ReaderFrom(v) != nil
},
},
},
Expand Down Expand Up @@ -897,13 +892,13 @@ func BuiltinReadFunc(c Call) (ret Object, err error) {
if buffered {
return Bytes{}, nil
}
b, err = io.ReadAll(reader.Value.(Reader))
b, err = io.ReadAll(ReaderFrom(reader.Value))
s = len(b)
} else {
if len(b) == 0 {
b = make([]byte, l)
}
s, err = reader.Value.(Reader).Read(b)
s, err = ReaderFrom(reader.Value).Read(b)
}

if err != nil {
Expand All @@ -930,7 +925,7 @@ func BuiltinWriteFunc(c Call) (ret Object, err error) {
}

arg := c.Args.Get(0)
if w2, ok := arg.(Writer); ok {
if w2 := WriterFrom(arg); w2 != nil {
w = w2
c.Args.Shift()
}
Expand Down
6 changes: 2 additions & 4 deletions helper/namedargvar.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ func NamedArgOfWriter(name string) *gad.NamedArgVar {
TypeAssertion: &gad.TypeAssertion{
Handlers: map[string]gad.TypeAssertionHandler{
"writer": func(v gad.Object) (ok bool) {
_, ok = v.(gad.Writer)
return
return gad.WriterFrom(v) != nil
},
},
},
Expand All @@ -22,8 +21,7 @@ func NamedArgOfReader(name string) *gad.NamedArgVar {
TypeAssertion: &gad.TypeAssertion{
Handlers: map[string]gad.TypeAssertionHandler{
"reader": func(v gad.Object) (ok bool) {
_, ok = v.(gad.Reader)
return
return gad.ReaderFrom(v) != nil
},
},
},
Expand Down
28 changes: 28 additions & 0 deletions objects_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -493,3 +493,31 @@ func IsTypeAssignableTo(a, b ObjectType) bool {
}
return false
}

type ToReaderConverter interface {
Reader() Reader
}

type ToWriterConverter interface {
Writer() Writer
}

func ReaderFrom(o Object) (r Reader) {
if r, _ = o.(Reader); r != nil {
return r
}
if tr, _ := o.(ToReaderConverter); tr != nil {
return tr.Reader()
}
return
}

func WriterFrom(o Object) (r Writer) {
if r, _ = o.(Writer); r != nil {
return r
}
if tr, _ := o.(ToWriterConverter); tr != nil {
return tr.Writer()
}
return
}
14 changes: 14 additions & 0 deletions objects_reflect.go
Original file line number Diff line number Diff line change
Expand Up @@ -1054,6 +1054,20 @@ type ReflectStruct struct {
Interface any
}

func (s *ReflectStruct) Reader() Reader {
if r, ok := s.Interface.(io.Reader); ok {
return NewReader(r)
}
return nil
}

func (s *ReflectStruct) Writer() Writer {
if w, ok := s.Interface.(io.Writer); ok {
return NewWriter(w)
}
return nil
}

var (
_ ReflectValuer = (*ReflectStruct)(nil)
_ Iterabler = (*ReflectStruct)(nil)
Expand Down

0 comments on commit 8d05747

Please sign in to comment.