76fbe2eee0
Replace maglevc's hand-rolled command-tree CLI with git.ipng.ch/ipng/golang-cli v1.3.0, mirroring the evpnc refactor. The tree (commands.go) and the gRPC-status error unwrap (color.go) stay app-specific; the generic parts — parse tree, completion, '?'-help, the readline shell, one-shot dispatch, color helpers, and the watch keypress handler — now come from the library. - main.go: a single cli.App[grpcapi.MaglevClient] with a Connect callback; drops the flag/color-default/dispatch boilerplate. - commands.go: `type node = cli.Node[grpcapi.MaglevClient]`; label() -> cli.Label(); dyn* gain the captured-args parameter the library's Dynamic signature carries; runQuit returns cli.ErrQuit. - watch.go: keypress.WaitForKey replaces the inline cbreak helper. - color.go: only formatError remains, reading cli.ColorEnabled(). - delete tree.go, complete.go, shell.go. - tests use the library API; add TestTreeValid (cli.Validate). Behavior is unchanged except labels/errors now use the library's bright ANSI palette (was dark); escape lengths are identical so tabwriter alignment is unaffected. maglevc additionally gains the OpenBSD readline fix and BSD-correct watch keypress it previously lacked. Builds on linux and openbsd. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
29 lines
835 B
Go
29 lines
835 B
Go
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package main
|
|
|
|
import (
|
|
"strings"
|
|
|
|
cli "git.ipng.ch/ipng/golang-cli"
|
|
)
|
|
|
|
// formatError returns a user-friendly error string. gRPC status errors are
|
|
// unwrapped to show only the server's message (no "rpc error: code = ..."
|
|
// boilerplate). The result is wrapped in red when color is enabled. The label()
|
|
// helper and the ANSI palette now live in the golang-cli library (cli.Label,
|
|
// cli.Red, ...); only this gRPC-specific unwrap stays here, wired in as
|
|
// App.FormatError.
|
|
func formatError(err error) string {
|
|
msg := err.Error()
|
|
// google.golang.org/grpc/status errors format as:
|
|
// rpc error: code = <Code> desc = <message>
|
|
if i := strings.Index(msg, " desc = "); i >= 0 {
|
|
msg = msg[i+len(" desc = "):]
|
|
}
|
|
if cli.ColorEnabled() {
|
|
return cli.Red + msg + cli.Reset
|
|
}
|
|
return msg
|
|
}
|