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;
20
21// Third Party Imports
22
23// Local Imports
24use crate::Application;
25
26/* === Constants === */
27
28/* === Macros === */
29
30/* === Type Aliases === */
31
32/* === Structs === */
33
34/* === Enums === */
35
36pub enum Recorded<A: Application> {
37    Transaction(crate::operations::Response<A::Transaction>),
38    Record(A::Record),
39    System(SystemFact),
40}
41
42/* === Traits === */
43
44/* === Implementations === */
45
46impl<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/* === Public Functions === */
81
82/* === Private Functions === */
83
84/* === Tests === */