aoe2_probe/parse/
builder.rs

1use super::code::Decode;
2use crate::io::Source;
3use crate::utils::{DynString, PatchedMap, C256, C4};
4
5use super::Token;
6
7pub struct TokenBuilder {}
8
9impl TokenBuilder {
10    /// Build a token tree according to the given one.
11    pub fn create_from_template(template: &Token, source: &mut Source) -> Result<Token, String> {
12        match template {
13            Token::UInt8(_) => Ok(u8::from_le_vec(source)?.into()),
14            Token::UInt16(_) => Ok(u16::from_le_vec(source)?.into()),
15            Token::UInt32(_) => Ok(u32::from_le_vec(source)?.into()),
16            Token::Int8(_) => Ok(i8::from_le_vec(source)?.into()),
17            Token::Int16(_) => Ok(i16::from_le_vec(source)?.into()),
18            Token::Int32(_) => Ok(i32::from_le_vec(source)?.into()),
19            Token::Float32(_) => Ok(f32::from_le_vec(source)?.into()),
20            Token::Float64(_) => Ok(f64::from_le_vec(source)?.into()),
21            Token::Char4(_) => Ok(C4::from_le_vec(source)?.into()),
22            Token::Char256(_) => Ok(C256::from_le_vec(source)?.into()),
23            Token::Str16(_) => Ok(DynString::<u16>::from_le_vec(source)?.into()),
24            Token::Str32(_) => Ok(DynString::<u32>::from_le_vec(source)?.into()),
25            Token::Union(map) => {
26                let mut mock = PatchedMap::new();
27                let patches = &map.patches;
28                for (key, token) in map.iter() {
29                    let mut template = token.clone();
30                    if patches.contains_key(key) {
31                        let patch = &patches[key];
32                        patch(&mut mock, &mut template);
33                    }
34                    mock.push_back(key, TokenBuilder::create_from_template(&template, source)?);
35                }
36                Ok(mock.into())
37            }
38            Token::Vector(vec) => {
39                let mut mock = Vec::<Token>::new();
40                for token in vec {
41                    mock.push(Self::create_from_template(token, source)?)
42                }
43
44                Ok(mock.into())
45            }
46        }
47    }
48}