1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 10:14:06 +02:00

make gameevent parsing more backwards compatible

This commit is contained in:
Robin Appelman 2019-08-25 15:20:09 +02:00
commit dc4c071b68
2 changed files with 3415 additions and 6323 deletions

View file

@ -229,20 +229,17 @@ pub fn generate_game_events(demo: Demo) -> TokenStream {
}); });
let name = Ident::new(&format!("{}Event", get_event_name(&event.name)), span); let name = Ident::new(&format!("{}Event", get_event_name(&event.name)), span);
let item_count = Literal::usize_unsuffixed(event.entries.len());
let entry_constructors = event.entries.iter().rev().map(|entry| { let entry_constructors = event.entries.iter().map(|entry| {
let name_str = get_entry_name(&entry.name); let name_str = get_entry_name(&entry.name);
let name = Ident::new(&name_str, span); let name = Ident::new(&name_str, span);
let ty = Ident::new(get_type_name(entry.kind), span); let ty = Ident::new(get_type_name(entry.kind), span);
quote!( quote!(
let #name: #ty = #ty::from_value( let #name = match iter.next() {
values.pop().ok_or(MalformedDemoError::MalformedGameEvent( Some(value) => #ty::from_value(value, #name_str)?,
GameEventError::IncorrectValueCount, None => #ty::default()
))?, };
#name_str,
)?;
) )
}); });
@ -251,15 +248,9 @@ pub fn generate_game_events(demo: Demo) -> TokenStream {
quote!(#name,) quote!(#name,)
}); });
let length_check = if event.entries.len() > 0 { let iter = if event.entries.len() > 0 {
quote!( quote!(
if values.len() < #item_count { let mut iter = values.into_iter();
return Err(MalformedDemoError::MalformedGameEvent(
GameEventError::IncorrectValueCount,
)
.into());
}
values.truncate(#item_count);
) )
} else { } else {
quote!() quote!()
@ -278,9 +269,8 @@ pub fn generate_game_events(demo: Demo) -> TokenStream {
} }
impl FromRawGameEvent for #name { impl FromRawGameEvent for #name {
fn from_raw_event(mut #param_name: Vec<GameEventValue>) -> Result<Self> { fn from_raw_event(#param_name: Vec<GameEventValue>) -> Result<Self> {
#length_check #iter
#(#entry_constructors)* #(#entry_constructors)*
Ok(#name { Ok(#name {

File diff suppressed because it is too large Load diff