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
use error::*;
use appscraps_module::util::ModuleList;
use appscraps_module::util::ModuleMap;
use appscraps_module::util::PathResolver;
use load::file_funcs;
use load::Payload;
use serialization::DynamicEvents;
use std::collections::BTreeMap;
use string;
use util::DynamicEventList;
use util::DynamicEventMap;

pub struct DynamicEventLoader { }

impl DynamicEventLoader {
    pub fn load(
        module_list: &ModuleList,
        module_map: &ModuleMap,
        path_resolver: &PathResolver
    ) -> Result<Payload> {
        Self::load_events(
            module_list,
            module_map,
            path_resolver,
        )
    }

    fn create_dynamic_events(
        module_index: usize,
        dynamic_events_json: DynamicEvents,
        pre_dynamic_event_list: &mut Vec<String>,
        pre_dynamic_event_map: &mut BTreeMap<(usize, String), usize>,
    ) -> Result<()> {
        for dynamic_event in dynamic_events_json.destructure() {
            let dynamic_event_id = pre_dynamic_event_list.len();
            let dynamic_event_key = (module_index, dynamic_event.clone());

            if let Some(_) = pre_dynamic_event_map.insert(dynamic_event_key, dynamic_event_id) {
                return Err(ErrorKind::EventAlreadyExists(dynamic_event, module_index).into())
            }

            pre_dynamic_event_list.push(dynamic_event);
        }

        Ok(())
    }

    fn load_events(
        module_list: &ModuleList,
        module_map: &ModuleMap,
        path_resolver: &PathResolver,
    ) -> Result<Payload> {
        let my_index = try!(module_map.get_index(string::self_appscraps_module_name()));
        let dynamic_events_file_name = string::dynamic_events_file_name();

        let mut pre_dynamic_event_list = Vec::new();
        let mut pre_dynamic_event_map = BTreeMap::new();

        for module in module_list {
            let module_index = module.get_index();

            if let Some(dynamic_events_json_path) =
                try!(
                    path_resolver.try_find_submodule_file_path(
                        dynamic_events_file_name,
                        module_index,
                        my_index
                    )
                ) {
                let dynamic_events_json = try!(file_funcs::dynamic_events_from_path(dynamic_events_json_path));
                try!(
                    Self::create_dynamic_events(module_index, dynamic_events_json, &mut pre_dynamic_event_list, &mut pre_dynamic_event_map)
                );
            }
        }

        let dynamic_event_list = DynamicEventList::new(pre_dynamic_event_list);
        let dynamic_event_map = DynamicEventMap::new(pre_dynamic_event_map);

        let result =
            Payload::new(
                dynamic_event_list,
                dynamic_event_map
            );
        Ok(result)
    }
}