aboutsummaryrefslogtreecommitdiff
path: root/mod/mod-ci-github-service-data.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'mod/mod-ci-github-service-data.cxx')
-rw-r--r--mod/mod-ci-github-service-data.cxx60
1 files changed, 49 insertions, 11 deletions
diff --git a/mod/mod-ci-github-service-data.cxx b/mod/mod-ci-github-service-data.cxx
index 68a1426..d3071b2 100644
--- a/mod/mod-ci-github-service-data.cxx
+++ b/mod/mod-ci-github-service-data.cxx
@@ -10,6 +10,15 @@ namespace brep
{
using event = json::event;
+ [[noreturn]] static void
+ throw_json (json::parser& p, const string& m)
+ {
+ throw json::invalid_json_input (
+ p.input_name,
+ p.line (), p.column (), p.position (),
+ m);
+ }
+
service_data::
service_data (const string& json)
{
@@ -32,11 +41,7 @@ namespace brep
if (v == "local") kind = local;
else if (v == "remote") kind = remote;
else
- {
- throw json::invalid_json_input (
- p.input_name, p.line (), p.column (), p.position (),
- "invalid service data kind: '" + v + '\'');
- }
+ throw_json (p, "invalid service data kind: '" + v + '\'');
}
pre_check = p.next_expect_member_boolean<bool> ("pre_check");
@@ -44,7 +49,7 @@ namespace brep
warning_success = p.next_expect_member_boolean<bool> ("warning_success");
- // Installation access token.
+ // Installation access token (IAT).
//
p.next_expect_name ("installation_access");
installation_access = gh_installation_access_token (p);
@@ -79,7 +84,16 @@ namespace brep
nid = *v;
}
- build_state s (to_build_state (p.next_expect_member_string ("state")));
+ build_state s;
+ try
+ {
+ s = to_build_state (p.next_expect_member_string ("state"));
+ }
+ catch (const invalid_argument& e)
+ {
+ throw_json (p, e.what ());
+ }
+
bool ss (p.next_expect_member_boolean<bool> ("state_synced"));
optional<result_status> rs;
@@ -87,7 +101,14 @@ namespace brep
string* v (p.next_expect_member_string_null ("status"));
if (v != nullptr)
{
- rs = bbot::to_result_status (*v);
+ try
+ {
+ rs = bbot::to_result_status (*v);
+ }
+ catch (const invalid_argument& e)
+ {
+ throw_json (p, e.what ());
+ }
assert (s == build_state::built);
}
}
@@ -186,11 +207,28 @@ namespace brep
s.member ("warning_success", warning_success);
- // Installation access token.
+ // Installation access token (IAT).
//
s.member_begin_object ("installation_access");
s.member ("token", installation_access.token);
- s.member ("expires_at", gh_to_iso8601 (installation_access.expires_at));
+
+ // IAT expires_at timestamp.
+ //
+ {
+ string v;
+ try
+ {
+ v = gh_to_iso8601 (installation_access.expires_at);
+ }
+ catch (const runtime_error& e)
+ {
+ throw invalid_argument ("invalid IAT expires_at value " +
+ to_string (system_clock::to_time_t (
+ installation_access.expires_at)));
+ }
+ s.member ("expires_at", move (v));
+ }
+
s.end_object ();
s.member ("installation_id", installation_id);
@@ -232,7 +270,7 @@ namespace brep
if (cr.status)
{
assert (cr.state == build_state::built);
- s.value (to_string (*cr.status));
+ s.value (to_string (*cr.status)); // Doesn't throw.
}
else
s.value (nullptr);