use std::collections::BTreeMap;
use objects::object::ContentHash;
use serde::{Deserialize, Serialize};
use super::body_details::{Execution, LogRef, Outcome, Repro};
pub const CI_VERDICT_BODY_SCHEMA_VERSION: u32 = 1;
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct CiVerdictBody {
pub schema_version: u32,
pub repo: String,
pub state: StateRef,
pub basis: Basis,
pub check: CheckDescriptor,
pub outcome: Outcome,
pub execution: Execution,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub log: Option<LogRef>,
pub repro: Repro,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub check_set_digest: Option<String>,
}
impl CiVerdictBody {
#[must_use]
pub fn canonical_bytes(&self) -> Vec<u8> {
serde_json::to_vec(self).expect("CiVerdictBody is always serializable")
}
#[must_use]
pub fn content_hash(&self) -> ContentHash {
ContentHash::compute(&self.canonical_bytes())
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct StateRef {
pub content_hash: String,
pub change_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub logical_change_id: Option<String>,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct Basis {
pub kind: BasisKind,
pub evaluated_tree_digest: String,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BasisKind {
#[default]
Branch,
MergedWith {
target_state: String,
behind_count: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
merge_algorithm_version: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
conflict_policy: Option<String>,
},
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct CheckDescriptor {
pub name: String,
pub class: CheckClass,
pub definition_digest: String,
pub command: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub image_digest: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub toolchain: Option<String>,
pub params: BTreeMap<String, String>,
pub services: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub node_id: Option<String>,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CheckClass {
Required,
#[default]
Advisory,
Informational,
}