harmos_runtime/state/
envelope.rs1pub use harmos_domain::state::{DefinitionId, Envelope, FactSource, Kind, SystemFact};
15
16use std::any::Any;
20use std::sync::Arc;
21
22use crate::Application;
26
27pub enum Recorded<A: Application> {
38 Transaction(Arc<A::Transaction>),
39 Record(A::Record),
40 System(SystemFact),
41}
42
43impl<A: Application> Clone for Recorded<A>
48where
49 A::Record: Clone,
50{
51 fn clone(&self) -> Self {
52 match self {
53 Self::Transaction(value) => Self::Transaction(Arc::clone(value)),
54 Self::Record(value) => Self::Record(value.clone()),
55 Self::System(value) => Self::System(value.clone()),
56 }
57 }
58}
59
60impl<A: Application> Recorded<A> {
61 pub fn kind(&self) -> Kind {
62 match self {
63 Self::Transaction(_) => Kind::Transaction,
64 Self::Record(_) => Kind::Record,
65 Self::System(_) => Kind::Record,
66 }
67 }
68
69 pub(crate) fn select<X: Clone + 'static>(&self) -> Option<X> {
70 if let Some(value) = (self as &dyn Any).downcast_ref::<X>() {
71 return Some(value.clone());
72 }
73 match self {
74 Self::Transaction(value) => (&**value as &dyn Any).downcast_ref::<X>().cloned(),
75 Self::Record(value) => (value as &dyn Any).downcast_ref::<X>().cloned(),
76 Self::System(value) => (value as &dyn Any).downcast_ref::<X>().cloned(),
77 }
78 }
79}
80
81