output.v

1.5 KB · raw

1//! Output for the command line: the ✦ / ✗ habit, and the `--json` shapes2//! agents read.3//!4//! Colour comes from `src.fmt`, so turning it off turns it off everywhere.5//! Every command that prints data has a JSON form with stable field names, and6//! every error is `{"error": "..."}` on stderr. Exit codes are fixed: 07//! success, 1 refusal or error, 2 bad usage.89module cli1011import json12import src.fmt1314pub fn color_enabled() bool {15	return fmt.colour_enabled()16}1718pub fn amber(text string) string {19	return fmt.amber(text)20}2122pub fn red(text string) string {23	return fmt.red(text)24}2526pub fn green(text string) string {27	return fmt.green(text)28}2930pub fn dim(text string) string {31	return fmt.dim(text)32}3334pub fn ok(message string) {35	println('  ${fmt.amber(fmt.glyph_ok)} ${message}')36}3738pub fn note(message string) {39	println('  ${fmt.dim(message)}')40}4142pub fn warn(message string) {43	println('  ${fmt.amber('!')} ${message}')44}4546// fail prints a refusal and returns the exit code to hand back.47pub fn fail(message string) int {48	eprintln('  ${fmt.red(fmt.glyph_fail)} ${message}')49	return 150}5152pub fn fail_json(message string) int {53	eprintln(json.encode({54		'error': message55	}))56	return 157}5859pub fn usage_error(message string) int {60	eprintln('  ${fmt.red(fmt.glyph_fail)} ${message}')61	return 262}6364// refuse reports an error in whichever shape the command was asked for.65pub fn refuse(as_json bool, message string) int {66	if as_json {67		return fail_json(message)68	}69	return fail(message)70}7172pub fn emit_json(value string) {73	println(value)74}