35 lines
1008 B
Ruby
35 lines
1008 B
Ruby
require "json"
|
|
require_relative "result"
|
|
require_relative "delivery"
|
|
require_relative "formatter"
|
|
|
|
module Relay
|
|
# Summarizes delivery outcomes for the `relay report` command, including
|
|
# entries the Delivery dead-letter path wrote out.
|
|
class Reports
|
|
def initialize(dead_letter_path:, formatter: Formatter.new)
|
|
@dead_letter_path = dead_letter_path
|
|
@formatter = formatter
|
|
end
|
|
|
|
def failed_deliveries
|
|
return Result.ok([]) unless File.exist?(@dead_letter_path)
|
|
|
|
entries = File.readlines(@dead_letter_path).map { |line| JSON.parse(line) }
|
|
Result.ok(entries)
|
|
rescue JSON::ParserError => e
|
|
Result.err("dead-letter file corrupt: #{e.message}")
|
|
end
|
|
|
|
def render
|
|
failures = failed_deliveries
|
|
return failures if failures.err?
|
|
|
|
rows = failures.value.map do |entry|
|
|
[entry["url"], Delivery.attempt_budget, "dead-lettered"]
|
|
end
|
|
rows.empty? ? Result.ok("no failed deliveries") : @formatter.render(rows)
|
|
end
|
|
end
|
|
end
|