1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use crate::app::event::Event;
use crate::app::state::Consumed;
use crate::app::DynError;
use crate::sketchbook::JsonSerde;
use serde::Serialize;

/// Shorthand to create a `Consumed::Reversible` instance given all the components.
pub(crate) fn make_reversible(
    state_change: Event,
    original_event: &Event,
    reverse_event: Event,
) -> Consumed {
    Consumed::Reversible {
        state_change,
        perform_reverse: (original_event.clone(), reverse_event),
    }
}

/// Shorthand to create a "refresh" event for a list of items.
pub(crate) fn make_refresh_event<T>(
    full_path: &[String],
    item_list: Vec<T>,
) -> Result<Event, DynError>
where
    T: Serialize,
{
    Ok(Event {
        path: full_path.to_vec(),
        payload: Some(serde_json::to_string(&item_list)?),
    })
}

/// Shorthand to create a "state-change" event given a path and potential payload.
/// Payload can be any struct that implements `JsonSerde`.
pub(crate) fn make_state_change<'a, T>(path: &[&str], payload: &T) -> Event
where
    T: JsonSerde<'a>,
{
    Event::build(path, Some(&payload.to_json_str()))
}

/// Prepare "state-change" event for the `model` component of the `sketch`, given
/// `at_path` - a path suffix used at the model level, and potential payload.
/// Payload can be any struct that implements `JsonSerde`.
pub(crate) fn mk_model_state_change<'a, T: JsonSerde<'a>>(at_path: &[&str], payload: &T) -> Event {
    let mut full_path = vec!["sketch", "model"];
    full_path.extend_from_slice(at_path);
    make_state_change(&full_path, payload)
}

/// Prepare "state-change" event for the `observations` component of the `sketch`, given
/// `at_path` - a path suffix used at the observations level, and potential payload.
/// Payload can be any struct that implements `JsonSerde`.
pub(crate) fn mk_obs_state_change<'a, T: JsonSerde<'a>>(at_path: &[&str], payload: &T) -> Event {
    let mut full_path = vec!["sketch", "observations"];
    full_path.extend_from_slice(at_path);
    make_state_change(&full_path, payload)
}

/// Prepare "state-change" event for the `dynamic properties` component of the `sketch`, given
/// `at_path` - a path suffix used at the properties level (after "dynamic"), and potential payload.
/// Payload can be any struct that implements `JsonSerde`.
pub(crate) fn mk_dyn_prop_state_change<'a, T: JsonSerde<'a>>(
    at_path: &[&str],
    payload: &T,
) -> Event {
    let mut full_path = vec!["sketch", "properties", "dynamic"];
    full_path.extend_from_slice(at_path);
    make_state_change(&full_path, payload)
}

/// Prepare "state-change" event for the `static properties` component of the `sketch`, given
/// `at_path` - a path suffix used at the properties level (after "static"), and potential payload.
/// Payload can be any struct that implements `JsonSerde`.
pub(crate) fn mk_stat_prop_state_change<'a, T: JsonSerde<'a>>(
    at_path: &[&str],
    payload: &T,
) -> Event {
    let mut full_path = vec!["sketch", "properties", "static"];
    full_path.extend_from_slice(at_path);
    make_state_change(&full_path, payload)
}

/// Prepare event for the `model` component of the `sketch`, given `at_path` - a path suffix
/// used at the model level, and a `payload`.
pub(crate) fn mk_model_event(at_path: &[&str], payload: Option<&str>) -> Event {
    let mut full_path = vec!["sketch", "model"];
    full_path.extend_from_slice(at_path);
    Event::build(&full_path, payload)
}

/// Prepare event for the `observations` component of the `sketch`, given `at_path` - a path suffix
/// used at the observations manager level, and a `payload`.
pub(crate) fn mk_obs_event(at_path: &[&str], payload: Option<&str>) -> Event {
    let mut full_path = vec!["sketch", "observations"];
    full_path.extend_from_slice(at_path);
    Event::build(&full_path, payload)
}

/// Prepare event for the `dynamic properties` component of the `sketch`, given `at_path` - a
/// path suffix used at the property manager level (after `dynamic`), and a `payload`.
pub(crate) fn mk_dyn_prop_event(at_path: &[&str], payload: Option<&str>) -> Event {
    let mut full_path = vec!["sketch", "properties", "dynamic"];
    full_path.extend_from_slice(at_path);
    Event::build(&full_path, payload)
}

/// Prepare event for the `static properties` component of the `sketch`, given `at_path` - a
/// path suffix used at the property manager level (after `static`), and a `payload`.
pub(crate) fn mk_stat_prop_event(at_path: &[&str], payload: Option<&str>) -> Event {
    let mut full_path = vec!["sketch", "properties", "static"];
    full_path.extend_from_slice(at_path);
    Event::build(&full_path, payload)
}