Skip to main content

harmos_runtime/state/
envelope.rs

1/* ***
2 *
3 * Harmos
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * ***
8 */
9
10/* === Modules === */
11
12/* === Re-Exports === */
13
14pub use harmos_domain::state::{DefinitionId, Envelope, FactSource, Kind, SystemFact};
15
16/* === Imports === */
17
18// Standard Library Imports
19use std::any::Any;
20use std::sync::Arc;
21
22// Third Party Imports
23
24// Local Imports
25use crate::Application;
26
27/* === Constants === */
28
29/* === Macros === */
30
31/* === Type Aliases === */
32
33/* === Structs === */
34
35/* === Enums === */
36
37pub enum Recorded<A: Application> {
38    Transaction(Arc<A::Transaction>),
39    Record(A::Record),
40    System(SystemFact),
41}
42
43/* === Traits === */
44
45/* === Implementations === */
46
47impl<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/* === Public Functions === */
82
83/* === Private Functions === */
84
85/* === Tests === */