mirror of
https://codeberg.org/demostf/parser.git
synced 2026-06-03 18:24:05 +02:00
make gameevent parsing more backwards compatible
This commit is contained in:
parent
11539fa06b
commit
dc4c071b68
2 changed files with 3415 additions and 6323 deletions
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue