aoe2_probe/parse/
builder.rs1use 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 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}