Skip to main content

runx_contracts/
execution.rs

1//! Execution semantics contracts: governed disposition, outcome state, and receipt outcome.
2use serde::{Deserialize, Serialize};
3
4use crate::{JsonObject, JsonValue};
5
6#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
7#[serde(rename_all = "snake_case")]
8pub enum GovernedDisposition {
9    Completed,
10    NeedsAgent,
11    PolicyDenied,
12    ApprovalRequired,
13    Observing,
14    Escalated,
15}
16
17#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
18#[serde(rename_all = "snake_case")]
19pub enum OutcomeState {
20    Pending,
21    Complete,
22    Expired,
23}
24
25#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
26#[serde(deny_unknown_fields)]
27pub struct ReceiptOutcome {
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub code: Option<String>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub summary: Option<String>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub observed_at: Option<String>,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub data: Option<JsonObject>,
36}
37
38#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
39#[serde(deny_unknown_fields)]
40pub struct ReceiptSurfaceRef {
41    #[serde(rename = "type")]
42    pub surface_type: String,
43    pub uri: String,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub label: Option<String>,
46}
47
48#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
49#[serde(deny_unknown_fields)]
50pub struct InputContextCapture {
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub capture: Option<bool>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub source: Option<String>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub max_bytes: Option<u64>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub snapshot: Option<JsonValue>,
59}
60
61#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
62#[serde(deny_unknown_fields)]
63pub struct ExecutionSemantics {
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub disposition: Option<GovernedDisposition>,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub outcome_state: Option<OutcomeState>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub outcome: Option<ReceiptOutcome>,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub input_context: Option<InputContextCapture>,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub surface_refs: Option<Vec<ReceiptSurfaceRef>>,
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub evidence_refs: Option<Vec<ReceiptSurfaceRef>>,
76}