mirror of
https://codeberg.org/demostf/parser.git
synced 2026-10-01 08:44:05 +02:00
cargo updates
This commit is contained in:
parent
802165d6fa
commit
1a5960f7c4
10 changed files with 375 additions and 329 deletions
563
Cargo.lock
generated
563
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
96
Cargo.toml
96
Cargo.toml
|
|
@ -1,14 +1,13 @@
|
||||||
[package]
|
[package]
|
||||||
name = "tf-demo-parser"
|
name = "tf-demo-parser"
|
||||||
description = "parser for tf2 demo files"
|
|
||||||
version = "0.7.0"
|
version = "0.7.0"
|
||||||
authors = ["Robin Appelman <robin@icewind.nl>"]
|
edition = "2024"
|
||||||
edition = "2021"
|
rust-version = "1.94.0"
|
||||||
license = "MIT OR Apache-2.0"
|
description = "parser for tf2 demo files"
|
||||||
repository = "https://codeberg.org/demostf/parser"
|
repository = "https://codeberg.org/demostf/parser"
|
||||||
exclude = ["tests/fuzz", "test_data"]
|
license = "MIT OR Apache-2.0"
|
||||||
|
exclude = ["test_data", "tests/fuzz"]
|
||||||
default-run = "parse_demo"
|
default-run = "parse_demo"
|
||||||
rust-version = "1.75.0"
|
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "tf_demo_parser"
|
name = "tf_demo_parser"
|
||||||
|
|
@ -45,54 +44,65 @@ path = "src/bin/strings.rs"
|
||||||
name = "direct_hits"
|
name = "direct_hits"
|
||||||
path = "src/bin/direct_hits.rs"
|
path = "src/bin/direct_hits.rs"
|
||||||
|
|
||||||
|
[[bench]]
|
||||||
|
harness = false
|
||||||
|
name = "parse"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitbuffer = { version = "0.11.3", features = ["serde"] }
|
|
||||||
num_enum = "0.7.2"
|
|
||||||
num-traits = "0.2.19"
|
|
||||||
enumflags2 = { version = "0.7.10", features = ["serde"] }
|
|
||||||
snap = "1.1.1"
|
|
||||||
serde = { version = "1.0.203", features = ["derive", "rc"] }
|
|
||||||
serde_json = "1.0.117"
|
|
||||||
serde_repr = "0.1.19"
|
|
||||||
thiserror = "2.0.4"
|
|
||||||
parse-display = "0.9.1"
|
|
||||||
main_error = "0.1.2"
|
|
||||||
jemallocator = { version = "0.5.4", optional = true }
|
|
||||||
better-panic = { version = "0.3.0", optional = true }
|
better-panic = { version = "0.3.0", optional = true }
|
||||||
fnv = "1.0.7"
|
bitbuffer = { version = "0.11.3", features = ["serde"] }
|
||||||
tracing = { version = "0.1.40", optional = true }
|
|
||||||
tracing-subscriber = { version = "0.3.18", features = ["env-filter"], optional = true }
|
|
||||||
itertools = "0.14.0"
|
|
||||||
const-fnv1a-hash = "1.1.0"
|
const-fnv1a-hash = "1.1.0"
|
||||||
|
enumflags2 = { version = "0.7.12", features = ["serde"] }
|
||||||
|
fnv = "1.0.7"
|
||||||
|
itertools = "0.15.0"
|
||||||
|
jemallocator = { version = "0.5.4", optional = true }
|
||||||
|
main_error = "0.1.2"
|
||||||
|
num_enum = "0.7.6"
|
||||||
|
num-traits = "0.2.19"
|
||||||
|
parse-display = "0.11.0"
|
||||||
|
serde = { version = "1.0.229", features = ["derive", "rc"] }
|
||||||
|
serde_json = "1.0.151"
|
||||||
|
serde_repr = "0.1.21"
|
||||||
|
snap = "1.1.2"
|
||||||
|
thiserror = "2.0.20"
|
||||||
|
tracing = { version = "0.1.44", optional = true }
|
||||||
|
tracing-subscriber = { version = "0.3.23", features = ["env-filter"], optional = true }
|
||||||
|
|
||||||
# schema
|
# schema
|
||||||
schemars = { version = "1.0.4", optional = true }
|
schemars = { version = "1.2.2", optional = true }
|
||||||
|
|
||||||
|
Inflector = { version = "0.11", default-features = false, optional = true }
|
||||||
|
lazy_static = { version = "1", optional = true }
|
||||||
|
prettyplease = { version = "0.3", optional = true }
|
||||||
|
proc-macro2 = { version = "1", optional = true }
|
||||||
|
|
||||||
# codegen
|
# codegen
|
||||||
quote = { version = "1", optional = true }
|
quote = { version = "1", optional = true }
|
||||||
syn = { version = "2", features = ["full"], optional = true }
|
syn = { version = "3", features = ["full"], optional = true }
|
||||||
Inflector = { version = "0.11", default-features = false, optional = true }
|
|
||||||
proc-macro2 = { version = "1", optional = true }
|
|
||||||
tempfile = { version = "3", optional = true }
|
tempfile = { version = "3", optional = true }
|
||||||
lazy_static = { version = "1", optional = true }
|
|
||||||
prettyplease = { version = "0.2", optional = true }
|
|
||||||
|
|
||||||
log = { version = "0.4.21", features = [] }
|
log = { version = "0.4.34", features = [] }
|
||||||
|
|
||||||
[features]
|
|
||||||
schema = ["schemars", "bitbuffer/schemars_1"]
|
|
||||||
trace = ["tracing", "tracing-subscriber"]
|
|
||||||
codegen = ["better-panic", "quote", "syn", "Inflector", "proc-macro2", "tempfile", "lazy_static", "prettyplease"]
|
|
||||||
write = []
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
pretty_assertions = "1.4.0"
|
iai-callgrind = "0.16.1"
|
||||||
|
insta = { version = "1.48.0", features = ["json"] }
|
||||||
|
pretty_assertions = "1.4.1"
|
||||||
test-case = "3.3.1"
|
test-case = "3.3.1"
|
||||||
iai-callgrind = "0.15.2"
|
|
||||||
insta = { version = "1.39.0", features = ["json"] }
|
|
||||||
|
|
||||||
[profile.release]
|
[features]
|
||||||
lto = "thin"
|
codegen = [
|
||||||
|
"Inflector",
|
||||||
|
"better-panic",
|
||||||
|
"lazy_static",
|
||||||
|
"prettyplease",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
"tempfile"
|
||||||
|
]
|
||||||
|
schema = ["bitbuffer/schemars_1", "schemars"]
|
||||||
|
trace = ["tracing", "tracing-subscriber"]
|
||||||
|
write = []
|
||||||
|
|
||||||
[profile.bench]
|
[profile.bench]
|
||||||
debug = true
|
debug = true
|
||||||
|
|
@ -100,7 +110,5 @@ debug = true
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
opt-level = 2
|
opt-level = 2
|
||||||
|
|
||||||
[[bench]]
|
[profile.release]
|
||||||
name = "parse"
|
lto = "thin"
|
||||||
harness = false
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,6 @@
|
||||||
demostf-parser-schema = pkgs: pkgs.demostf-parser-schema;
|
demostf-parser-schema = pkgs: pkgs.demostf-parser-schema;
|
||||||
};
|
};
|
||||||
|
|
||||||
tools = pkgs: with pkgs; [bacon cargo-insta];
|
tools = pkgs: with pkgs; [bacon cargo-insta cargo-edit];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,6 @@ use std::env;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
|
||||||
use main_error::MainError;
|
use main_error::MainError;
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
use tf_demo_parser::demo::header::Header;
|
|
||||||
use tf_demo_parser::demo::parser::analyser::MatchState;
|
|
||||||
use tf_demo_parser::demo::parser::gamestateanalyser::GameStateAnalyser;
|
use tf_demo_parser::demo::parser::gamestateanalyser::GameStateAnalyser;
|
||||||
pub use tf_demo_parser::{Demo, DemoParser, Parse};
|
pub use tf_demo_parser::{Demo, DemoParser, Parse};
|
||||||
|
|
||||||
|
|
@ -12,14 +9,6 @@ pub use tf_demo_parser::{Demo, DemoParser, Parse};
|
||||||
#[global_allocator]
|
#[global_allocator]
|
||||||
static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
|
static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
struct JsonDemo {
|
|
||||||
header: Header,
|
|
||||||
#[serde(flatten)]
|
|
||||||
state: MatchState,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() -> Result<(), MainError> {
|
fn main() -> Result<(), MainError> {
|
||||||
#[cfg(feature = "better-panic")]
|
#[cfg(feature = "better-panic")]
|
||||||
better_panic::install();
|
better_panic::install();
|
||||||
|
|
|
||||||
|
|
@ -129,8 +129,8 @@ impl schemars::JsonSchema for MaybeUtf8String {
|
||||||
String::schema_name()
|
String::schema_name()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn json_schema(gen: &mut schemars::SchemaGenerator) -> schemars::Schema {
|
fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
|
||||||
String::json_schema(gen)
|
String::json_schema(generator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ use crate::demo::parser::ParseBitSkip;
|
||||||
use crate::demo::sendprop::{SendProp, SendPropIdentifier, SendPropValue};
|
use crate::demo::sendprop::{SendProp, SendPropIdentifier, SendPropValue};
|
||||||
use crate::{Parse, ParseError, ParserState, ReadResult, Result, Stream};
|
use crate::{Parse, ParseError, ParserState, ReadResult, Result, Stream};
|
||||||
use parse_display::{Display, FromStr};
|
use parse_display::{Display, FromStr};
|
||||||
use std::cmp::{min, Ordering};
|
use std::cmp::{Ordering, min};
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use crate::demo::data::ServerTick;
|
use crate::demo::data::ServerTick;
|
||||||
|
|
@ -120,7 +120,7 @@ impl<E: Endianness> BitRead<'_, E> for BaselineIndex {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn read_unchecked(stream: &mut BitReadStream<'_, E>, end: bool) -> ReadResult<Self> {
|
unsafe fn read_unchecked(stream: &mut BitReadStream<'_, E>, end: bool) -> ReadResult<Self> {
|
||||||
bool::read_unchecked(stream, end).map(BaselineIndex::from)
|
unsafe { bool::read_unchecked(stream, end).map(BaselineIndex::from) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bit_size() -> Option<usize> {
|
fn bit_size() -> Option<usize> {
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ use bitbuffer::{BitWrite, BitWriteStream, Endianness};
|
||||||
use num_enum::TryFromPrimitive;
|
use num_enum::TryFromPrimitive;
|
||||||
use parse_display::{Display, FromStr};
|
use parse_display::{Display, FromStr};
|
||||||
use serde::de::Error;
|
use serde::de::Error;
|
||||||
use serde::{ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer};
|
use serde::{Deserialize, Deserializer, Serialize, Serializer, ser::SerializeMap};
|
||||||
use std::collections::{BTreeMap, HashMap};
|
use std::collections::{BTreeMap, HashMap};
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
|
|
@ -143,7 +143,7 @@ impl Class {
|
||||||
where
|
where
|
||||||
u8: TryFrom<U>,
|
u8: TryFrom<U>,
|
||||||
{
|
{
|
||||||
Class::try_from(u8::try_from(number).unwrap_or_default()).unwrap()
|
Class::try_from(u8::try_from(number).unwrap_or_default()).unwrap_or_default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,12 @@ pub use self::messagetypeanalyser::MessageTypeAnalyser;
|
||||||
|
|
||||||
use crate::demo::header::Header;
|
use crate::demo::header::Header;
|
||||||
|
|
||||||
|
use crate::Stream;
|
||||||
use crate::demo::packet::Packet;
|
use crate::demo::packet::Packet;
|
||||||
use crate::demo::parser::analyser::Analyser;
|
use crate::demo::parser::analyser::Analyser;
|
||||||
pub use crate::demo::parser::analyser::MatchState;
|
pub use crate::demo::parser::analyser::MatchState;
|
||||||
pub use crate::demo::parser::handler::{DemoHandler, MessageHandler, NullHandler};
|
pub use crate::demo::parser::handler::{DemoHandler, MessageHandler, NullHandler};
|
||||||
pub use crate::demo::parser::state::ParserState;
|
pub use crate::demo::parser::state::ParserState;
|
||||||
use crate::Stream;
|
|
||||||
|
|
||||||
pub mod analyser;
|
pub mod analyser;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
|
|
@ -190,7 +190,7 @@ impl<A: MessageHandler + BorrowMessageHandler> DemoTicker<'_, A> {
|
||||||
|
|
||||||
/// Process the next packet
|
/// Process the next packet
|
||||||
#[allow(clippy::should_implement_trait)]
|
#[allow(clippy::should_implement_trait)]
|
||||||
pub fn next(&mut self) -> Result<Option<Tick<A::Output>>> {
|
pub fn next(&mut self) -> Result<Option<Tick<'_, A::Output>>> {
|
||||||
Ok(
|
Ok(
|
||||||
if let Some(packet) = self.packets.next(&self.handler.state_handler)? {
|
if let Some(packet) = self.packets.next(&self.handler.state_handler)? {
|
||||||
let tick = packet.tick();
|
let tick = packet.tick();
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ use crate::demo::message::packetentities::{
|
||||||
BaselineIndex, EntityId, PacketEntitiesMessage, PacketEntity, UpdateType,
|
BaselineIndex, EntityId, PacketEntitiesMessage, PacketEntity, UpdateType,
|
||||||
};
|
};
|
||||||
use crate::demo::message::stringtable::StringTableMeta;
|
use crate::demo::message::stringtable::StringTableMeta;
|
||||||
use crate::demo::message::{log_base2, Message, MessageType};
|
use crate::demo::message::{Message, MessageType, log_base2};
|
||||||
use crate::demo::packet::datatable::{
|
use crate::demo::packet::datatable::{
|
||||||
ClassId, ParseSendTable, SendTable, SendTableName, ServerClass,
|
ClassId, ParseSendTable, SendTable, SendTableName, ServerClass,
|
||||||
};
|
};
|
||||||
|
|
@ -158,7 +158,7 @@ impl ParserState {
|
||||||
class_id: ClassId,
|
class_id: ClassId,
|
||||||
send_table: &SendTable,
|
send_table: &SendTable,
|
||||||
is_delta: bool,
|
is_delta: bool,
|
||||||
) -> Result<Cow<[SendProp]>> {
|
) -> Result<Cow<'_, [SendProp]>> {
|
||||||
match self.get_instance_baseline(baseline_index).get(entity_index) {
|
match self.get_instance_baseline(baseline_index).get(entity_index) {
|
||||||
Some(baseline) if baseline.server_class == class_id && is_delta => {
|
Some(baseline) if baseline.server_class == class_id && is_delta => {
|
||||||
Ok(Cow::Borrowed(&baseline.props))
|
Ok(Cow::Borrowed(&baseline.props))
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ use crate::{ParseError, ReadResult, Result, Stream};
|
||||||
use bitbuffer::{BitRead, BitReadStream, Endianness, LittleEndian};
|
use bitbuffer::{BitRead, BitReadStream, Endianness, LittleEndian};
|
||||||
#[cfg(feature = "write")]
|
#[cfg(feature = "write")]
|
||||||
use bitbuffer::{BitWrite, BitWriteSized, BitWriteStream};
|
use bitbuffer::{BitWrite, BitWriteSized, BitWriteStream};
|
||||||
use enumflags2::{bitflags, BitFlags};
|
use enumflags2::{BitFlags, bitflags};
|
||||||
#[cfg(feature = "write")]
|
#[cfg(feature = "write")]
|
||||||
use num_traits::Signed;
|
use num_traits::Signed;
|
||||||
use parse_display::Display;
|
use parse_display::Display;
|
||||||
|
|
@ -336,8 +336,8 @@ impl schemars::JsonSchema for SendPropFlags {
|
||||||
"SendPropFlags".into()
|
"SendPropFlags".into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn json_schema(gen: &mut schemars::SchemaGenerator) -> schemars::Schema {
|
fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
|
||||||
u16::json_schema(gen)
|
u16::json_schema(generator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -697,11 +697,7 @@ impl SendPropValue {
|
||||||
0.0f32
|
0.0f32
|
||||||
};
|
};
|
||||||
|
|
||||||
if is_negative {
|
if is_negative { -z } else { z }
|
||||||
-z
|
|
||||||
} else {
|
|
||||||
z
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_ => Self::read_float(stream, float_definition)?,
|
_ => Self::read_float(stream, float_definition)?,
|
||||||
};
|
};
|
||||||
|
|
@ -1284,8 +1280,8 @@ impl schemars::JsonSchema for SendPropIdentifier {
|
||||||
"SendPropIdentifier".into()
|
"SendPropIdentifier".into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn json_schema(gen: &mut schemars::SchemaGenerator) -> schemars::Schema {
|
fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
|
||||||
<String as schemars::JsonSchema>::json_schema(gen)
|
<String as schemars::JsonSchema>::json_schema(generator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1558,11 +1554,7 @@ pub fn read_bit_normal(stream: &mut Stream) -> ReadResult<f32> {
|
||||||
let is_negative = stream.read()?;
|
let is_negative = stream.read()?;
|
||||||
let frac_val: u16 = stream.read_sized(11)?;
|
let frac_val: u16 = stream.read_sized(11)?;
|
||||||
let value = (frac_val as f32) * get_frac_factor(11);
|
let value = (frac_val as f32) * get_frac_factor(11);
|
||||||
if is_negative {
|
if is_negative { Ok(-value) } else { Ok(value) }
|
||||||
Ok(-value)
|
|
||||||
} else {
|
|
||||||
Ok(value)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "write")]
|
#[cfg(feature = "write")]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue