1pub use error::{Error, Warning};
6pub use result::Result;
7
8mod error;
9mod grammar;
10mod phase;
11mod result;
12
13use std::convert::TryFrom;
14
15use corewars_core::load_file::Warrior;
16
17use phase::{CommentsRemoved, Evaluated, Expanded, Output, Phase, Raw};
18
19pub fn parse(input: &str) -> Result<Warrior> {
24 parse_impl(input).into()
25}
26
27fn parse_impl(input: &str) -> std::result::Result<Warrior, Error> {
28 let raw = Phase::<Raw>::from(input);
29
30 let cleaned = Phase::<CommentsRemoved>::from(raw);
31
32 let expanded = Phase::<Expanded>::from(cleaned);
33
34 let evaluated = Phase::<Evaluated>::try_from(expanded)?;
35
36 let output = Phase::<Output>::from(evaluated);
37
38 Ok(output.state.warrior)
39}