use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum RiskLevel {
R0,
R1,
R2,
R3,
R4,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AcceptanceItem {
pub id: String,
pub statement: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct GoalDocument {
pub id: String,
pub outcome: String,
#[serde(default = "default_risk")]
pub risk: RiskLevel,
#[serde(default)]
pub acceptance: Vec<AcceptanceItem>,
#[serde(default)]
pub invariants: Vec<String>,
#[serde(default)]
pub forbidden: Vec<String>,
#[serde(default)]
pub not_in_scope: Vec<String>,
#[serde(default)]
pub touches: Vec<String>,
}
fn default_risk() -> RiskLevel {
RiskLevel::R2
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct GoalContract {
pub schema: String,
pub id: String,
pub outcome: String,
pub risk: RiskLevel,
pub acceptance: Vec<AcceptanceItem>,
pub invariants: Vec<String>,
pub forbidden: Vec<String>,
pub not_in_scope: Vec<String>,
pub touches: Vec<String>,
pub digest: String,
}
impl GoalContract {
pub const SCHEMA: &'static str = "goal-contract/v1";
}