telltale_machine/
guard.rs1use std::collections::BTreeMap;
4
5use serde::{Deserialize, Serialize};
6
7use crate::coroutine::Value;
8
9#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
11pub struct LayerId(pub String);
12
13impl From<&str> for LayerId {
14 fn from(value: &str) -> Self {
15 Self(value.to_string())
16 }
17}
18
19pub trait GuardLayer {
21 type Resource: Clone;
23 type Evidence: Clone;
25
26 fn open_(&mut self, layer: &LayerId) -> Result<(Self::Resource, Self::Evidence), String>;
32
33 fn close(&mut self, layer: &LayerId, evidence: Self::Evidence) -> Result<(), String>;
39
40 fn encode_evidence(evidence: &Self::Evidence) -> Result<Value, String>;
46
47 fn decode_evidence(value: &Value) -> Result<Self::Evidence, String>;
53}
54
55#[derive(Debug, Clone, Default, Serialize, Deserialize)]
57pub struct InMemoryGuardLayer {
58 pub resources: BTreeMap<LayerId, Value>,
60}
61
62impl GuardLayer for InMemoryGuardLayer {
63 type Resource = Value;
64 type Evidence = Value;
65
66 fn open_(&mut self, layer: &LayerId) -> Result<(Self::Resource, Self::Evidence), String> {
67 let resource = self
68 .resources
69 .get(layer)
70 .cloned()
71 .ok_or_else(|| format!("unknown guard layer {}", layer.0))?;
72 Ok((resource.clone(), resource))
73 }
74
75 fn close(&mut self, layer: &LayerId, evidence: Self::Evidence) -> Result<(), String> {
76 if !self.resources.contains_key(layer) {
77 return Err(format!("unknown guard layer {}", layer.0));
78 }
79 let _ = evidence;
82 Ok(())
83 }
84
85 fn encode_evidence(evidence: &Self::Evidence) -> Result<Value, String> {
86 Ok(evidence.clone())
87 }
88
89 fn decode_evidence(value: &Value) -> Result<Self::Evidence, String> {
90 Ok(value.clone())
91 }
92}