Module: Julewire::Core::CLI::LogFormats

Defined in:
lib/julewire/core/cli/log_formats.rb,
lib/julewire/core/cli/log_formats/console_text.rb,
lib/julewire/core/cli/log_formats/record_decoder.rb,
lib/julewire/core/cli/log_formats/core_json_decoder.rb,
lib/julewire/core/cli/log_formats/core_json_encoder.rb

Defined Under Namespace

Modules: CoreJsonDecoder, CoreJsonEncoder, RecordDecoder Classes: ConsoleText, Entry

Constant Summary collapse

AUTO_FORMAT =
:auto
FORMAT_NAME_PATTERN =
/\A[a-z][a-z0-9_]*\z/

Class Method Summary collapse

Class Method Details

.decode(payload, format: AUTO_FORMAT) ⇒ Object

Raises:

  • (TypeError)


30
31
32
33
34
35
36
# File 'lib/julewire/core/cli/log_formats.rb', line 30

def decode(payload, format: AUTO_FORMAT)
  raise TypeError, "log entry must be a JSON object" unless payload.is_a?(Hash)

  format = normalize(format)
  entry = format == AUTO_FORMAT ? auto_decode_entry(payload) : named_decode_entry(format, payload)
  entry.decoder.call(payload)
end

.encode(record, format:) ⇒ Object



38
39
40
41
42
# File 'lib/julewire/core/cli/log_formats.rb', line 38

def encode(record, format:)
  name = normalize(format)
  entry = named_encode_entry(name)
  entry.encoder.call(record)
end

.load(name) ⇒ Object



60
61
62
63
64
65
# File 'lib/julewire/core/cli/log_formats.rb', line 60

def load(name)
  path = "julewire/#{name}"
  require path
rescue LoadError => e
  raise unless e.path == path
end

.normalize(value) ⇒ Object

Raises:

  • (ArgumentError)


53
54
55
56
57
58
# File 'lib/julewire/core/cli/log_formats.rb', line 53

def normalize(value)
  name = Core.normalize_name(value, name: "log format")
  return name if name.to_s.match?(FORMAT_NAME_PATTERN)

  raise ArgumentError, "log format must contain lowercase letters, digits, or underscores"
end

.record_from_json_line(line, line_number:, format: AUTO_FORMAT) ⇒ Object



44
45
46
47
48
49
50
51
# File 'lib/julewire/core/cli/log_formats.rb', line 44

def record_from_json_line(line, line_number:, format: AUTO_FORMAT)
  payload = JSON.parse(line)
  Records::Record.from_normalized_hash(decode(payload, format: format))
rescue JSON::ParserError => e
  raise ArgumentError, "line #{line_number}: invalid JSON: #{e.message}"
rescue TypeError, ArgumentError => e
  raise ArgumentError, "line #{line_number}: #{e.message}"
end

.register(name, decoder: nil, encoder: nil, priority: 0) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/julewire/core/cli/log_formats.rb', line 14

def register(name, decoder: nil, encoder: nil, priority: 0)
  name = normalize(name)
  validate_component(decoder, :decoder) if decoder
  validate_component(encoder, :encoder) if encoder
  existing = @entries.find { it.name == name }
  priority = priority.to_i
  entry = Entry.new(
    name: name,
    decoder: decoder || existing&.decoder,
    encoder: encoder || existing&.encoder,
    priority: priority.zero? && existing ? existing.priority : priority
  )
  @entries = @entries.reject { it.name == name } + [entry]
  entry
end