1#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Deserialize, serde::Serialize)]
5pub struct CapabilityId(pub String);
6
7impl CapabilityId {
8 #[must_use]
10 pub fn new(name: impl Into<String>) -> Self {
11 Self(name.into())
12 }
13
14 #[must_use]
16 pub fn as_str(&self) -> &str {
17 &self.0
18 }
19}
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Deserialize, serde::Serialize)]
23#[non_exhaustive]
24pub enum DeterminismClass {
25 Deterministic,
27 DeterministicModuloRounding,
29 NonDeterministic,
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Deserialize, serde::Serialize)]
35#[non_exhaustive]
36pub enum SideEffectClass {
37 Pure,
39 ReadsMemory,
41 WritesMemory,
43 Synchronizing,
45 Atomic,
47}
48
49#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Deserialize, serde::Serialize)]
51#[non_exhaustive]
52pub enum CostHint {
53 Cheap,
55 Medium,
57 Expensive,
59 Unknown,
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Deserialize, serde::Serialize)]
65pub struct OperationContract {
66 #[serde(default)]
68 pub capability_requirements: Option<smallvec::SmallVec<[CapabilityId; 4]>>,
69 #[serde(default)]
71 pub determinism: Option<DeterminismClass>,
72 #[serde(default)]
74 pub side_effect: Option<SideEffectClass>,
75 #[serde(default)]
77 pub cost_hint: Option<CostHint>,
78}
79
80impl OperationContract {
81 #[must_use]
83 pub const fn none() -> Self {
84 Self {
85 capability_requirements: None,
86 determinism: None,
87 side_effect: None,
88 cost_hint: None,
89 }
90 }
91}
92
93impl Default for OperationContract {
94 fn default() -> Self {
95 Self::none()
96 }
97}