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
use super::{Command, CommandGroup, Event, EventType, LoopCommand, TriggerCommand};

#[derive(Debug)]
pub struct Storyboard {
    pub events: Vec<Event>,
}

impl Storyboard {
    pub fn new() -> Storyboard {
        Storyboard {
            events: Vec::<Event>::new(),
        }
    }

    pub fn from_string(data: String) -> Storyboard {
        let mut storyboard = Storyboard::new();
        let mut root_group = CommandGroup::new();
        let mut command_group = &mut root_group;

        let mut last_event = &Event::new();
        let events = data.split("\r\n");
        for event in events {
            if event.starts_with("//") || event.starts_with("[Events]") || event.trim().len() <= 0 {
                continue;
            }

            if event.to_string().starts_with(" ") {
                let mut cmd_raw = event;
                let mut depth = 0;

                while cmd_raw.starts_with(" ") {
                    depth += 1;
                    cmd_raw = &cmd_raw[1..];
                }

                if depth < 2 {
                    if last_event.etype == EventType::Unknown {
                        continue;
                    }

                    command_group = &mut root_group;
                }

                let columns: Vec<&str> = cmd_raw.split(",").collect();
                match columns[0] {
                    "T" => {
                        let name = columns[1];
                        let mut start_time = 0;
                        let mut end_time = 0;
                        let mut group_number = 0;

                        if columns.len() > 2 {
                            start_time = columns[2].parse::<i32>().unwrap();
                        }
                        if columns.len() > 3 {
                            end_time = columns[3].parse::<i32>().unwrap();
                        }
                        if columns.len() > 4 {
                            group_number = columns[4].parse::<i32>().unwrap();
                        }

                        command_group = command_group.add_trigger(TriggerCommand::new(
                            name.to_string(),
                            start_time,
                            end_time,
                            group_number,
                        ));
                    }

                    "L" => {
                        let start_time = columns[1].parse::<i32>().unwrap();
                        let count = columns[2].parse::<i32>().unwrap();
                        command_group = command_group.add_loop(LoopCommand::new(start_time, count));
                    }
                    _ => command_group
                        .commands
                        .push(Command::from_string(cmd_raw.to_string())),
                }

                continue;
            }

            let mut ev = Event::from_string(event.to_string());
            ev.commands = root_group.commands.to_owned();
            storyboard.events.push(ev);
            last_event = storyboard.events.last_mut().unwrap();
            root_group = CommandGroup::new();
            command_group = &mut root_group;
        }

        storyboard
    }
}