Update nom to v8

This commit is contained in:
Lucas Schwiderski
2025-04-22 22:06:44 +02:00
parent a431fb31f8
commit 7a31a7346b
2 changed files with 46 additions and 31 deletions

View File

@@ -14,7 +14,7 @@ heapless = "0.8.0"
[dependencies.nom]
default-features = false
version = "7.1.3"
version = "8.0.0"
[features]
default = ["std"]

View File

@@ -8,70 +8,76 @@ use nom::branch::alt;
use nom::bytes::complete::tag;
use nom::character::complete::{digit0, digit1};
use nom::combinator::{map, map_res, opt, value};
use nom::sequence::{delimited, preceded, tuple};
use nom::sequence::{delimited, preceded};
use nom::IResult;
use nom::Parser;
macro_rules! tag_parser {
($sig:ident, $tag:expr, $ret:expr) => {
fn $sig(input: &str) -> IResult<&str, AnsiSequence> {
value($ret, tag($tag))(input)
value($ret, tag($tag)).parse(input)
}
};
}
fn parse_u32(input: &str) -> IResult<&str, u32> {
map_res(digit1, |s: &str| s.parse::<u32>())(input)
map_res(digit1, |s: &str| s.parse::<u32>()).parse(input)
}
fn parse_u8(input: &str) -> IResult<&str, u8> {
map_res(digit1, |s: &str| s.parse::<u8>())(input)
map_res(digit1, |s: &str| s.parse::<u8>()).parse(input)
}
// TODO kind of ugly, would prefer to pass in the default so we could use it for
// all escapes with defaults (not just those that default to 1).
fn parse_def_cursor_int(input: &str) -> IResult<&str, u32> {
map(digit0, |s: &str| s.parse::<u32>().unwrap_or(1))(input)
map(digit0, |s: &str| s.parse::<u32>().unwrap_or(1)).parse(input)
}
fn cursor_pos(input: &str) -> IResult<&str, AnsiSequence> {
map(
tuple((
(
tag("["),
parse_def_cursor_int,
opt(tag(";")),
parse_def_cursor_int,
alt((tag("H"), tag("f"))),
)),
),
|(_, x, _, y, _)| AnsiSequence::CursorPos(x, y),
)(input)
)
.parse(input)
}
fn escape(input: &str) -> IResult<&str, AnsiSequence> {
value(AnsiSequence::Escape, tag("\u{1b}"))(input)
value(AnsiSequence::Escape, tag("\u{1b}")).parse(input)
}
fn cursor_up(input: &str) -> IResult<&str, AnsiSequence> {
map(delimited(tag("["), parse_def_cursor_int, tag("A")), |am| {
AnsiSequence::CursorUp(am)
})(input)
})
.parse(input)
}
fn cursor_down(input: &str) -> IResult<&str, AnsiSequence> {
map(delimited(tag("["), parse_def_cursor_int, tag("B")), |am| {
AnsiSequence::CursorDown(am)
})(input)
})
.parse(input)
}
fn cursor_forward(input: &str) -> IResult<&str, AnsiSequence> {
map(delimited(tag("["), parse_def_cursor_int, tag("C")), |am| {
AnsiSequence::CursorForward(am)
})(input)
})
.parse(input)
}
fn cursor_backward(input: &str) -> IResult<&str, AnsiSequence> {
map(delimited(tag("["), parse_def_cursor_int, tag("D")), |am| {
AnsiSequence::CursorBackward(am)
})(input)
})
.parse(input)
}
fn graphics_mode1(input: &str) -> IResult<&str, AnsiSequence> {
@@ -79,23 +85,25 @@ fn graphics_mode1(input: &str) -> IResult<&str, AnsiSequence> {
let mode =
Vec::from_slice(&[val]).expect("Vec::from_slice should allocate sufficient size");
AnsiSequence::SetGraphicsMode(mode)
})(input)
})
.parse(input)
}
fn graphics_mode2(input: &str) -> IResult<&str, AnsiSequence> {
map(
tuple((tag("["), parse_u8, tag(";"), parse_u8, tag("m"))),
(tag("["), parse_u8, tag(";"), parse_u8, tag("m")),
|(_, val1, _, val2, _)| {
let mode = Vec::from_slice(&[val1, val2])
.expect("Vec::from_slice should allocate sufficient size");
AnsiSequence::SetGraphicsMode(mode)
},
)(input)
)
.parse(input)
}
fn graphics_mode3(input: &str) -> IResult<&str, AnsiSequence> {
map(
tuple((
(
tag("["),
parse_u8,
tag(";"),
@@ -103,22 +111,23 @@ fn graphics_mode3(input: &str) -> IResult<&str, AnsiSequence> {
tag(";"),
parse_u8,
tag("m"),
)),
),
|(_, val1, _, val2, _, val3, _)| {
let mode = Vec::from_slice(&[val1, val2, val3])
.expect("Vec::from_slice should allocate sufficient size");
AnsiSequence::SetGraphicsMode(mode)
},
)(input)
)
.parse(input)
}
fn graphics_mode4(input: &str) -> IResult<&str, AnsiSequence> {
value(AnsiSequence::SetGraphicsMode(Vec::new()), tag("[m"))(input)
value(AnsiSequence::SetGraphicsMode(Vec::new()), tag("[m")).parse(input)
}
fn graphics_mode5(input: &str) -> IResult<&str, AnsiSequence> {
map(
tuple((
(
tag("["),
parse_u8,
tag(";"),
@@ -130,13 +139,14 @@ fn graphics_mode5(input: &str) -> IResult<&str, AnsiSequence> {
tag(";"),
parse_u8,
tag("m"),
)),
),
|(_, val1, _, val2, _, val3, _, val4, _, val5, _)| {
let mode = Vec::from_slice(&[val1, val2, val3, val4, val5])
.expect("Vec::from_slice should allocate sufficient size");
AnsiSequence::SetGraphicsMode(mode)
},
)(input)
)
.parse(input)
}
fn graphics_mode(input: &str) -> IResult<&str, AnsiSequence> {
@@ -146,26 +156,30 @@ fn graphics_mode(input: &str) -> IResult<&str, AnsiSequence> {
graphics_mode3,
graphics_mode4,
graphics_mode5,
))(input)
))
.parse(input)
}
fn set_mode(input: &str) -> IResult<&str, AnsiSequence> {
map(delimited(tag("[="), parse_u8, tag("h")), |val| {
AnsiSequence::SetMode(val)
})(input)
})
.parse(input)
}
fn reset_mode(input: &str) -> IResult<&str, AnsiSequence> {
map(delimited(tag("[="), parse_u8, tag("l")), |val| {
AnsiSequence::ResetMode(val)
})(input)
})
.parse(input)
}
fn set_top_and_bottom(input: &str) -> IResult<&str, AnsiSequence> {
map(
tuple((tag("["), parse_u32, tag(";"), parse_u32, tag("r"))),
(tag("["), parse_u32, tag(";"), parse_u32, tag("r")),
|(_, x, _, y, _)| AnsiSequence::SetTopAndBottom(x, y),
)(input)
)
.parse(input)
}
tag_parser!(cursor_save, "[s", AnsiSequence::CursorSave);
@@ -267,9 +281,10 @@ fn combined(input: &str) -> IResult<&str, AnsiSequence> {
set_g1_graph,
set_single_shift2,
set_single_shift3,
))(input)
))
.parse(input)
}
pub fn parse_escape(input: &str) -> IResult<&str, AnsiSequence> {
preceded(tag("\u{1b}"), combined)(input)
preceded(tag("\u{1b}"), combined).parse(input)
}