Module: Fusion::CLI::Decoder

Extended by:
Decoder
Included in:
Decoder
Defined in:
lib/fusion/cli/decoder.rb

Constant Summary collapse

ENVELOPE_SHAPES =
{
  array: "[0, _] or [1, _]",
  object: '{"value": _} or {"error": _}',
}.freeze

Instance Method Summary collapse

Instance Method Details

#decode(text, mode:) ⇒ Object

String -> WirePair Doesn’t support mode ‘:unix`



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/fusion/cli/decoder.rb', line 20

def decode(text, mode:)
  case mode
  when :bang
    decode_bang(text)
  when :array
    decode_envelope(text, mode) do |raw|
      next unless raw.is_a?(Array) && raw.length == 2 && raw[0].is_a?(Integer)

      # The tag must be exactly the integer 0 or 1 (no 0.0 — Fusion equality is exact).
      [raw[0], raw[1]] if raw[0] == 0 || raw[0] == 1
    end
  when :object
    decode_envelope(text, mode) do |raw|
      next unless raw.is_a?(Hash) && raw.size == 1

      if raw.key?("value") then [0, raw["value"]]
      elsif raw.key?("error") then [1, raw["error"]]
      end
    end
  else
    raise Unreachable, "Unknown input mode #{mode}"
  end
end