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