69 lines
1.2 KiB
Go
69 lines
1.2 KiB
Go
package wand
|
|
|
|
import (
|
|
"code.squareroundforest.org/arpio/notation"
|
|
"fmt"
|
|
"io"
|
|
"reflect"
|
|
)
|
|
|
|
func fprintOne(out io.Writer, v any) error {
|
|
reader, ok := v.(io.Reader)
|
|
if ok {
|
|
_, err := io.Copy(out, reader)
|
|
return err
|
|
}
|
|
|
|
r := reflect.ValueOf(v)
|
|
if r.IsValid() {
|
|
t := r.Type()
|
|
if t.Implements(reflect.TypeFor[fmt.Stringer]()) {
|
|
_, err := fmt.Fprintln(out, r.Interface())
|
|
return err
|
|
}
|
|
|
|
if t.Kind() == reflect.Slice {
|
|
for i := 0; i < r.Len(); i++ {
|
|
if err := fprintOne(out, r.Index(i).Interface()); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
switch r.Kind() {
|
|
case reflect.Bool,
|
|
reflect.Int,
|
|
reflect.Int8,
|
|
reflect.Int16,
|
|
reflect.Int32,
|
|
reflect.Int64,
|
|
reflect.Uint,
|
|
reflect.Uint8,
|
|
reflect.Uint16,
|
|
reflect.Uint32,
|
|
reflect.Uint64,
|
|
reflect.Uintptr,
|
|
reflect.Float32,
|
|
reflect.Float64,
|
|
reflect.String:
|
|
_, err := fmt.Fprintln(out, v)
|
|
return err
|
|
default:
|
|
_, err := notation.Fprintlnwt(out, v)
|
|
return err
|
|
}
|
|
}
|
|
|
|
func printOutput(out io.Writer, o []any) error {
|
|
for _, oi := range o {
|
|
if err := fprintOne(out, oi); err != nil {
|
|
return fmt.Errorf("error displaying output: %w", err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|