split -> memchr

This commit is contained in:
Robin Appelman 2023-03-04 16:34:16 +01:00
commit 0a110dc0f0
3 changed files with 13 additions and 4 deletions

View file

@ -18,6 +18,7 @@ serde_json = "1"
main_error = "0.1" main_error = "0.1"
paste = "1" paste = "1"
logos = "0.12" logos = "0.12"
memchr = "2.5.0"
[dev-dependencies] [dev-dependencies]
criterion = "0.4" criterion = "0.4"

View file

@ -1,3 +1,5 @@
extern crate core;
pub use crate::common::{SteamId3, SubjectData, SubjectError, SubjectId}; pub use crate::common::{SteamId3, SubjectData, SubjectError, SubjectId};
use crate::event::GameEventError; use crate::event::GameEventError;
pub use crate::module::EventHandler; pub use crate::module::EventHandler;

View file

@ -6,6 +6,7 @@ use logos::{Lexer, Logos};
use nom::{IResult, Needed}; use nom::{IResult, Needed};
use std::convert::{TryFrom, TryInto}; use std::convert::{TryFrom, TryInto};
use std::num::ParseIntError; use std::num::ParseIntError;
use memchr::memchr;
/// Event that has only been minimally parsed. /// Event that has only been minimally parsed.
/// that way we can decide if we're interested in handling the event before parsing further /// that way we can decide if we're interested in handling the event before parsing further
@ -113,7 +114,7 @@ pub fn against_subject_parser(input: &str) -> IResult<&str, RawSubject> {
pub fn subject_parser(input: &str) -> Result<(&str, RawSubject)> { pub fn subject_parser(input: &str) -> Result<(&str, RawSubject)> {
if let Some(input) = input.strip_prefix('"') { if let Some(input) = input.strip_prefix('"') {
let (player, input) = input.split_once('"').ok_or(Error::Incomplete)?; let (player, input) = split_once(input, b'"', 1)?;
if player.ends_with("e>") { if player.ends_with("e>") {
Ok((input, RawSubject::Console)) Ok((input, RawSubject::Console))
} else { } else {
@ -126,15 +127,20 @@ pub fn subject_parser(input: &str) -> Result<(&str, RawSubject)> {
} else if &input[6..7] == "b" { } else if &input[6..7] == "b" {
Ok((&input[11..], RawSubject::Team(Team::Blue))) Ok((&input[11..], RawSubject::Team(Team::Blue)))
} else { } else {
let (_, input) = input[7..].split_once('"').ok_or(Error::Incomplete)?; let (_, input) = split_once(&input[7..], b'"', 1)?;
Ok((input, RawSubject::Team(Team::Spectator))) Ok((input, RawSubject::Team(Team::Spectator)))
} }
} else { } else {
let (system, _) = input.split_once(' ').ok_or(Error::Incomplete)?; let (system, input) = split_once(input, b' ', 0)?;
Ok((&input[system.len()..], RawSubject::System(system))) Ok((input, RawSubject::System(system)))
} }
} }
fn split_once(input: &str, delim: u8, offset: usize) -> Result<(&str, &str)> {
let end = memchr(delim, input.as_bytes()).ok_or(Error::Incomplete)?;
Ok((&input[..end], &input[(end + offset)..]))
}
#[derive(Copy, Clone, Debug, PartialEq, Logos)] #[derive(Copy, Clone, Debug, PartialEq, Logos)]
pub enum RawEventType { pub enum RawEventType {
#[token(r#"joined"#)] #[token(r#"joined"#)]