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
mod yaml;
use codespan::Span;
use codespan_reporting::diagnostic::{Diagnostic, Label};
use legion::{systems::CommandBuffer, Registry};
pub use self::yaml::*;
use crate::{phases::Phase, serialize::RegistryExt, BuildContext, Diagnostics};
pub fn phase() -> Phase {
Phase::with_setup(|res| {
res.insert(Diagnostics::new());
})
.and_then(run_system)
}
#[legion::system]
fn run(
cmd: &mut CommandBuffer,
#[resource] build_context: &BuildContext,
#[resource] diags: &mut Diagnostics,
) {
let src = &build_context.runefile;
match Document::parse(src) {
Ok(d) => {
cmd.exec_mut(move |_, res| {
res.insert(d.clone().to_v1());
});
},
Err(e) => {
diags.push(parse_failed_diagnostic(e));
},
}
}
fn parse_failed_diagnostic(e: serde_yaml::Error) -> Diagnostic<()> {
let msg = format!("Unable to parse the input: {}", e);
let mut diag = Diagnostic::error().with_message(msg);
if let Some(location) = e.location() {
let ix = location.index();
diag = diag.with_labels(vec![Label::primary((), ix..ix)]);
}
diag
}
pub(crate) fn register_components(registry: &mut Registry<String>) {
registry
.register_with_type_name::<Document>()
.register_with_type_name::<DocumentV1>()
.register_with_type_name::<Span>();
}