22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
# File 'lib/prdigest/cli.rb', line 22
def invoke(argv = ARGV, out: $stdout, err: $stderr, env: ENV,
system_path: "/etc/prdigest/config.yml", runner_factory: nil)
json_intent = Array(argv).any? { |arg| arg == "--json" || arg.start_with?("--json=") }
parsed = parse(argv)
return print_version(out) if parsed[:command] == "version"
return print_help(out) if %w[help --help -h].include?(parsed[:command])
unless %w[run serve].include?(parsed[:command])
raise ParseError, "unknown command"
end
path = Config.resolve_path(explicit: parsed[:config], env: env, system_path: system_path)
config = Config.load(path)
if parsed[:command] == "serve"
err.puts "prdigest serve: deferred in v0.1.x — use systemd timer + `prdigest run`"
return 0
end
validate_date!(parsed[:date]) if parsed[:date]
repositories = if parsed[:repos].empty?
nil
else
Config.normalize_repos(parsed[:repos], label: "--repo")
end
raise ConfigError, "GitHub token is missing" if config.github_token(env).empty?
if !parsed[:dry_run] && config.telegram_token(env).empty?
raise ConfigError, "Telegram bot token is missing"
end
factory = runner_factory || ->(**options) { Runner.new(**options) }
result = factory.call(
config: config,
date: parsed[:date],
dry_run: parsed[:dry_run],
repositories: repositories,
env: env
).call
present(result, json: parsed[:json], out: out, err: err)
result.exit_code
rescue ParseError => e
result = Result.failure(mode: "scheduled", error_kind: "cli", message: e.message)
present(result, json: json_intent, out: out, err: err)
result.exit_code
rescue ConfigError => e
result = Result.failure(mode: parsed && parsed[:date] ? "explicit_date_replay" : "scheduled", error_kind: "config", message: e.message)
present(result, json: parsed ? parsed[:json] : json_intent, out: out, err: err)
result.exit_code
rescue StandardError => e
result = Result.failure(
mode: parsed && parsed[:date] ? "explicit_date_replay" : "scheduled",
error_kind: "internal",
message: "unexpected CLI failure (#{e.class})"
)
present(result, json: parsed ? parsed[:json] : json_intent, out: out, err: err)
result.exit_code
end
|