feat(render): default JSON-model renderer + bright-white values (v1.4.0)
Render(v) treats JSON as the model: in -json mode it prints v as JSON; otherwise it paints it as text — object scalars on one line as key=value (keys blue, values bright white: a structural key/value distinction, not semantic color), nested objects indented, arrays one block per element, field order preserved via an order-keeping JSON decode. EmitJSON(v) is the JSON-only arm for commands that paint their own text. Operates on JSON only, so core stays protobuf-free (NFR-4). Adds White to the palette. The example gains an `inspect` command demoing Render (text vs -json). design.md FR-4.5/4.6 document the renderer and the "JSON is always the full record; synopsis-vs-detail is text-only" principle. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -177,6 +177,25 @@ func runWatch(ctx context.Context, _ inventory, _ []string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// runInspect demonstrates the default renderer: it builds one value (the model)
|
||||
// and hands it to cli.Render, which prints it as JSON under -json or as painted
|
||||
// text (blue keys, bright-white values, nested objects indented) otherwise — no
|
||||
// per-command text code.
|
||||
func runInspect(_ context.Context, inv inventory, _ []string) error {
|
||||
type host struct {
|
||||
Name string `json:"name"`
|
||||
Services []string `json:"services"`
|
||||
}
|
||||
f := struct {
|
||||
Count int `json:"count"`
|
||||
Hosts []host `json:"hosts"`
|
||||
}{Count: len(inv.servers)}
|
||||
for _, n := range inv.names() {
|
||||
f.Hosts = append(f.Hosts, host{Name: n, Services: inv.servers[n]})
|
||||
}
|
||||
return cli.Render(f)
|
||||
}
|
||||
|
||||
func runQuit(context.Context, inventory, []string) error { return cli.ErrQuit }
|
||||
|
||||
// buildTree is the single source of truth for the command set, built with the
|
||||
@@ -192,6 +211,7 @@ func buildTree() *cli.Node[inventory] {
|
||||
b.Dir("ping", "ping a server",
|
||||
b.Slot("<name>", "ping this server", dynServers, runPing)),
|
||||
b.Cmd("watch", "stream a few events (any key stops it)", runWatch),
|
||||
b.Cmd("inspect", "render the fleet via the default renderer (try -json / -color)", runInspect),
|
||||
b.Cmd("colors", "show the ANSI color palette", runColors),
|
||||
b.Cmd("quit", "exit the shell", runQuit),
|
||||
b.Cmd("exit", "exit the shell", runQuit),
|
||||
|
||||
Reference in New Issue
Block a user