wand/output.go

67 lines
1.2 KiB
Go
Raw Permalink Normal View History

2025-08-18 14:24:31 +02:00
package wand
import (
2025-08-24 04:46:54 +02:00
"code.squareroundforest.org/arpio/notation"
2025-08-18 14:24:31 +02:00
"fmt"
"io"
2025-08-24 04:46:54 +02:00
"reflect"
2025-08-18 14:24:31 +02:00
)
2025-09-01 02:07:48 +02:00
func fprintOne(out io.Writer, v any) error {
2025-09-06 21:38:50 +02:00
if reader, ok := v.(io.Reader); ok {
2025-09-01 02:07:48 +02:00
_, err := io.Copy(out, reader)
return err
2025-08-24 04:46:54 +02:00
}
2025-09-06 21:38:50 +02:00
if _, ok := v.(fmt.Stringer); ok {
_, err := fmt.Fprintln(out, v)
return err
2025-09-01 02:07:48 +02:00
}
2025-08-24 04:46:54 +02:00
2025-09-06 21:38:50 +02:00
r := reflect.ValueOf(v)
2025-09-01 02:07:48 +02:00
switch r.Kind() {
2025-09-06 21:38:50 +02:00
case reflect.Invalid:
return nil
2025-09-01 02:07:48 +02:00
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
2025-09-06 21:38:50 +02:00
case reflect.Slice:
for i := 0; i < r.Len(); i++ {
if err := fprintOne(out, r.Index(i).Interface()); err != nil {
return err
}
}
return nil
case reflect.Pointer:
return fprintOne(out, r.Elem().Interface())
2025-09-01 02:07:48 +02:00
default:
_, err := notation.Fprintlnwt(out, v)
return err
}
}
2025-08-24 04:46:54 +02:00
2025-09-01 02:07:48 +02:00
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)
2025-08-18 14:24:31 +02:00
}
}
return nil
}