Module: Browserctl::Commands::OutputFormat

Defined in:
lib/browserctl/commands/output_format.rb

Overview

Resolves and applies the unified ‘–output json,text,silent` flag.

Resolution order: explicit flag value -> ‘BROWSERCTL_OUTPUT` env var -> `text` (default).

Usage from a command:

fmt = OutputFormat.from(flag, ENV)
fmt.emit(payload_hash) { "human readable text" }

Per the v0.13 contract:

text   - prints the human-readable block; this is byte-identical to
         today's output. For most commands the human block already IS
         the JSON payload (legacy CLI shape) so the two collapse.
json   - prints the JSON payload via `to_json` (no pretty printing).
silent - prints nothing on stdout. Exit codes still carry the result.

The current format is also exposed as a process-wide default (‘OutputFormat.current`) so that `CliOutput#print_result` and other legacy helpers can consult it without every callsite threading the value through.

Defined Under Namespace

Classes: Formatter, InvalidFormat

Constant Summary collapse

VALID =
%w[json text silent].freeze
DEFAULT =
"text"
ENV_VAR =
"BROWSERCTL_OUTPUT"
FLAG =
"--output"

Class Method Summary collapse

Class Method Details

.currentObject

Process-wide current format. Set once by the CLI entry point after parsing the global flag; consulted by helpers that don’t otherwise have a reference to a Formatter (notably ‘CliOutput#print_result`).



121
122
123
# File 'lib/browserctl/commands/output_format.rb', line 121

def current
  @current ||= Formatter.new(DEFAULT)
end

.current=(formatter) ⇒ Object



125
126
127
# File 'lib/browserctl/commands/output_format.rb', line 125

def current=(formatter)
  @current = formatter
end

.extract!(args) ⇒ Object

Strip ‘–output VALUE` (or `–output=VALUE`) from `args` in place and return the extracted value (or nil). Recognises the long form only —there is intentionally no short alias.



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/browserctl/commands/output_format.rb', line 98

def extract!(args)
  i = 0
  while i < args.length
    arg = args[i]
    if arg == FLAG
      args.delete_at(i)
      value = args.delete_at(i) or
        raise InvalidFormat, "missing value for #{FLAG}"
      return value
    elsif arg.is_a?(String) && arg.start_with?("#{FLAG}=")
      value = arg.split("=", 2)[1]
      args.delete_at(i)
      return value
    else
      i += 1
    end
  end
  nil
end

.from(flag, env = ENV) ⇒ Object

Build a Formatter from an explicit flag value (or nil) and an env hash.



84
85
86
87
88
89
90
91
92
93
# File 'lib/browserctl/commands/output_format.rb', line 84

def from(flag, env = ENV)
  raw = flag || env[ENV_VAR] || DEFAULT
  mode = raw.to_s.strip.downcase
  mode = DEFAULT if mode.empty?
  unless VALID.include?(mode)
    raise InvalidFormat,
          "invalid --output value '#{raw}' (expected one of: #{VALID.join(', ')})"
  end
  Formatter.new(mode)
end

.install!(args, env = ENV) ⇒ Object

Convenience: parse the flag out of ‘args`, build a Formatter, set it as current, and return it.



131
132
133
134
135
136
# File 'lib/browserctl/commands/output_format.rb', line 131

def install!(args, env = ENV)
  flag = extract!(args)
  fmt  = from(flag, env)
  self.current = fmt
  fmt
end

.reset!Object

Reset to default — for tests.



139
140
141
# File 'lib/browserctl/commands/output_format.rb', line 139

def reset!
  @current = Formatter.new(DEFAULT)
end