diff --git a/Cargo.lock b/Cargo.lock index cf9e95a..f4a0cff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -149,20 +149,13 @@ version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "nom" -version = "7.1.3" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" dependencies = [ "memchr", - "minimal-lexical", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 444c918..f796791 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ anyhow = "1.0.86" codepage-437 = "0.1.0" peg_macro = { path = "./peg_macro"} insta = "1.39.0" -nom = "7.1.3" +nom = "8.0.0" compact_str = "0.9.0" rustc-hash = "2.1.1" lexopt = "0.3.1" diff --git a/src/world.rs b/src/world.rs index aae89f1..98de480 100644 --- a/src/world.rs +++ b/src/world.rs @@ -7,7 +7,6 @@ use nom::{ error::{ErrorKind, ParseError}, multi::count, number::complete::{le_i16, le_u8, le_u16}, - sequence::tuple, }; use crate::encoding::{decode_multiline, decode_oneline, encode_multiline, encode_oneline}; @@ -128,14 +127,14 @@ pub struct Stat { impl World { pub fn from_bytes(bytes: &[u8]) -> Result { - let (input, (_, num_boards)) = tuple((tag([0xff, 0xff]), le_i16)).parse(bytes)?; + let (input, (_, num_boards)) = (tag(&[0xff, 0xff][..]), le_i16).parse(bytes)?; let (input, (ammo, gems, keys)) = - tuple((le_i16, le_i16, count(bool_u8, 7))).parse(input)?; + (le_i16, le_i16, count(bool_u8, 7)).parse(input)?; let (input, (health, starting_board, torches, torch_cycles, energizer_cycles)) = - tuple((le_i16, le_i16, le_i16, le_i16, le_i16)).parse(input)?; - let (input, (_, score, world_name)) = tuple((take(2usize), le_i16, pstring(20)))(input)?; + (le_i16, le_i16, le_i16, le_i16, le_i16).parse(input)?; + let (input, (_, score, world_name)) = (take(2usize), le_i16, pstring(20)).parse(input)?; let (input, flags) = count(pstring(20), 10).parse(input)?; - let (_input, (time, time_ticks, locked)) = tuple((le_i16, le_i16, bool_u8)).parse(input)?; + let (_input, (time, time_ticks, locked)) = (le_i16, le_i16, bool_u8).parse(input)?; // Rest of header is padding; fast-forward starting from original input let (input, _) = take(512usize).parse(bytes)?; @@ -214,7 +213,7 @@ impl Board { let mut input = input; let mut terrain = Vec::with_capacity(NUM_TILES); while terrain.len() < NUM_TILES { - let (next_input, (count, element, color)) = tuple((le_u8, le_u8, le_u8))(input)?; + let (next_input, (count, element, color)) = (le_u8, le_u8, le_u8).parse(input)?; input = next_input; let count: u32 = if count == 0 { 256 } else { count.into() }; for _ in 0..count { @@ -226,11 +225,11 @@ impl Board { } // Read board info - let (input, (max_shots, is_dark)) = tuple((le_u8, bool_u8))(input)?; + let (input, (max_shots, is_dark)) = (le_u8, bool_u8).parse(input)?; let (input, (board_n, board_s, board_w, board_e)) = - tuple((le_u8, le_u8, le_u8, le_u8))(input)?; - let (input, (reenter_when_zapped, message)) = tuple((bool_u8, pstring(58)))(input)?; - let (input, (enter_x, enter_y, time_limit)) = tuple((le_u8, le_u8, le_i16))(input)?; + (le_u8, le_u8, le_u8, le_u8).parse(input)?; + let (input, (reenter_when_zapped, message)) = (bool_u8, pstring(58)).parse(input)?; + let (input, (enter_x, enter_y, time_limit)) = (le_u8, le_u8, le_i16).parse(input)?; let (input, _) = take(16usize)(input)?; // Read stats @@ -239,7 +238,7 @@ impl Board { if num_stats < 0 { return Err("cannot have a negative number of stats".into()); } - let (_input, stats) = count(Stat::from_bytes, num_stats as usize)(input)?; + let (_input, stats) = count(Stat::from_bytes, num_stats as usize).parse(input)?; Ok(Board { name, @@ -315,12 +314,12 @@ impl Board { impl Stat { pub fn from_bytes(input: &[u8]) -> IResult<&[u8], Self, LoadError> { - let (input, (x, y, x_step, y_step)) = tuple((le_u8, le_u8, le_i16, le_i16))(input)?; - let (input, (cycle, p1, p2, p3)) = tuple((le_i16, le_u8, le_u8, le_u8))(input)?; - let (input, (follower, leader)) = tuple((le_i16, le_i16))(input)?; - let (input, (under_element, under_color)) = tuple((le_u8, le_u8))(input)?; + let (input, (x, y, x_step, y_step)) = (le_u8, le_u8, le_i16, le_i16).parse(input)?; + let (input, (cycle, p1, p2, p3)) = (le_i16, le_u8, le_u8, le_u8).parse(input)?; + let (input, (follower, leader)) = (le_i16, le_i16).parse(input)?; + let (input, (under_element, under_color)) = (le_u8, le_u8).parse(input)?; let (input, _) = take(4usize)(input)?; - let (input, (instruction_pointer, length)) = tuple((le_i16, le_i16))(input)?; + let (input, (instruction_pointer, length)) = (le_i16, le_i16).parse(input)?; let (input, _) = take(8usize)(input)?; let (input, code_bytes) = take(0.max(length) as usize)(input)?; let code = decode_multiline(&code_bytes); @@ -387,7 +386,7 @@ fn pstring(cap: u8) -> impl Fn(&[u8]) -> IResult<&[u8], Vec, LoadError> { move |input: &[u8]| -> IResult<&[u8], Vec, LoadError> { let (input, len) = le_u8(input)?; if len >= cap { - return fail(input); + return fail().parse(input); } let (input, data) = take(len)(input)?; let (input, _) = take(cap - len)(input)?;