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}