network/preseem/output.go
2026-07-19 14:42:02 -05:00

60 lines
1.4 KiB
Go

package main
import (
"encoding/json"
"fmt"
"io"
"os"
"text/tabwriter"
)
// newTab returns a tabwriter on stdout configured to match uisp/main.go.
func newTab() *tabwriter.Writer {
return tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
}
// printJSON writes raw bytes (already JSON) verbatim followed by a
// newline. Used by --json mode to preserve the API's exact response.
func printJSON(raw []byte) error {
_, err := os.Stdout.Write(raw)
if err != nil {
return err
}
if len(raw) == 0 || raw[len(raw)-1] != '\n' {
_, err = io.WriteString(os.Stdout, "\n")
}
return err
}
// printMergedJSON emits a synthetic paginated envelope around items
// gathered across multiple pages by listAll. The shape mirrors the
// per-page response shape so downstream `jq` scripts keep working.
func printMergedJSON(items []json.RawMessage, p Paginator) error {
out := struct {
Data []json.RawMessage `json:"data"`
Paginator Paginator `json:"paginator"`
}{Data: items, Paginator: p}
b, err := json.Marshal(out)
if err != nil {
return err
}
return printJSON(b)
}
// printSingleJSON marshals an arbitrary value as JSON. Used by `get`
// subcommands when --json is set.
func printSingleJSON(v any) error {
b, err := json.Marshal(v)
if err != nil {
return err
}
return printJSON(b)
}
// fmtSpeed renders kbps as "-" if 0, else the integer.
func fmtSpeed(kbps int64) string {
if kbps == 0 {
return "-"
}
return fmt.Sprintf("%d", kbps)
}