Skip to main content

khive_types/
operation.rs

1//! Attribution to one parsed operation, independent of caller authority.
2
3/// Whether a dispatched operation consumed a resolved request reference.
4#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
7pub enum RefResolution {
8    /// All argument values were supplied literally.
9    Literal,
10    /// At least one argument value came from request reference resolution.
11    Resolved,
12}
13
14impl RefResolution {
15    /// Stable event-storage and wire spelling.
16    pub const fn name(self) -> &'static str {
17        match self {
18            Self::Literal => "literal",
19            Self::Resolved => "resolved",
20        }
21    }
22}
23
24impl core::str::FromStr for RefResolution {
25    type Err = crate::UnknownVariant;
26
27    fn from_str(value: &str) -> Result<Self, Self::Err> {
28        match value {
29            "literal" => Ok(Self::Literal),
30            "resolved" => Ok(Self::Resolved),
31            _ => Err(crate::UnknownVariant::new(
32                "ref_resolution",
33                value,
34                &["literal", "resolved"],
35            )),
36        }
37    }
38}
39
40/// Proven parser position and reference provenance for one request operation.
41///
42/// Absence of this value means unknown (legacy or non-request work), never a
43/// synthetic position zero. Nested synchronous dispatch retains its originating
44/// parser position rather than inventing another request operation.
45#[derive(Clone, Copy, Debug, PartialEq, Eq)]
46pub struct OperationAttribution {
47    /// Zero-based parser position, independent of completion or insertion order.
48    pub op_index: u32,
49    /// How the operation's argument values were obtained.
50    pub ref_resolution: RefResolution,
51}