Skip to main content

wowlab_engine_domain/rotation/
ast.rs

1//! Rotation parsing and structural validation.
2
3use itertools::Itertools;
4use wowlab_types::sim::{ROTATION_FORMAT_VERSION, Rotation};
5
6use super::{
7    error::{Error, Result},
8    validate::validate_rotation,
9};
10
11/// Parse a JSON string into a [`Rotation`] and validate it.
12///
13/// # Errors
14/// Returns an error for invalid JSON, unsupported versions, or failed structural validation.
15pub fn parse_and_validate(json: &str) -> Result<Rotation> {
16    let rotation: Rotation = serde_json::from_str(json)?;
17
18    validate(&rotation)?;
19
20    Ok(rotation)
21}
22
23pub(super) fn validate(rotation: &Rotation) -> Result<()> {
24    if rotation.version != ROTATION_FORMAT_VERSION {
25        return Err(Error::validation(format!(
26            "unsupported rotation format version {} (this build understands version {})",
27            rotation.version, ROTATION_FORMAT_VERSION
28        )));
29    }
30
31    let validation = validate_rotation(rotation);
32
33    if !validation.valid {
34        let message = validation.errors.iter().map(ToString::to_string).join("; ");
35
36        return Err(Error::validation(message));
37    }
38
39    Ok(())
40}