From 900b8b198e51f6e7126bec1ecf86c6c38005312c Mon Sep 17 00:00:00 2001 From: p6nj Date: Sat, 9 Nov 2024 18:39:28 -0500 Subject: [PATCH] move things around, add curry --- Cargo.toml | 1 + src/bng/score.rs | 1 - src/bng/score/de.rs | 33 +++++++++++---------------------- src/bng/score/lex/lexer.rs | 26 +++++++++++++++++++++++--- 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5c9009e..7aceef6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ bng_macros = { path = "bng_macros" } const_format = "0.2.33" thiserror = "1.0.64" derive-new = "0.7.0" +naan = "0.1.32" [features] default = ["play", "save"] diff --git a/src/bng/score.rs b/src/bng/score.rs index df2b65b..6a4a68e 100644 --- a/src/bng/score.rs +++ b/src/bng/score.rs @@ -8,7 +8,6 @@ use anyhow::Context; use bng_macros::{ModifierParser, QuickModifierParser, SlopeModifierParser}; use derive_new::new; use derived_deref::Deref; -use lex::lexer::atom; use nom::{ branch::alt, character::{complete::char, streaming::one_of}, diff --git a/src/bng/score/de.rs b/src/bng/score/de.rs index 11526fd..9756e9b 100644 --- a/src/bng/score/de.rs +++ b/src/bng/score/de.rs @@ -1,9 +1,11 @@ use std::{ fmt::{Debug, Display}, num::TryFromIntError, + ops::Deref, }; use derive_new::new; +use naan::fun::{F1Once, F2Once}; use nom::{ character::complete::one_of, combinator::all_consuming, @@ -18,7 +20,7 @@ use serde::{ }; use thiserror::Error; -use crate::bng::score::lex::lexer::atom; +use crate::bng::score::lex::lexer::root; use super::{ utils::{inflate, InflateError}, @@ -54,11 +56,7 @@ impl<'de> Deserialize<'de> for Atoms { Ok(Default::default()) } else { root(&sheet, ¬es) - .map_err(|e: nom::Err>| match e { - nom::Err::Incomplete(Needed::Unknown) => "needed some more bytes".to_string(), - nom::Err::Incomplete(Needed::Size(n)) => format!("needed {} more bytes", n), - nom::Err::Error(e) | nom::Err::Failure(e) => convert_error(sheet.as_str(), e), - }) + .map_err(|e| pretty_verbose_err.curry().call1(sheet.as_str()).call1(e)) .map_err(AtomsSerializeError::Parsing) .map_err(de::Error::custom) .and_then(|(_, v)| { @@ -71,22 +69,13 @@ impl<'de> Deserialize<'de> for Atoms { } } -fn maybe_yml_str_space<'a, E>() -> impl Parser<&'a str, Vec, E> +fn pretty_verbose_err(input: I, e: nom::Err>) -> String where - E: nom::error::ParseError<&'a str> + ContextError<&'a str>, + I: Deref, { - context("yml white space", many0(one_of(" \t\r\n"))) -} - -fn root<'a, E>(i: &'a str, notes: &'a str) -> IResult<&'a str, Vec, E> -where - E: ParseError<&'a str> - + ContextError<&'a str> - + FromExternalError<&'a str, TryFromIntError> - + FromExternalError<&'a str, E>, -{ - all_consuming(terminated( - many1(preceded(maybe_yml_str_space(), atom(notes))), - maybe_yml_str_space(), - ))(i) + match e { + nom::Err::Incomplete(Needed::Unknown) => "needed some more bytes".to_string(), + nom::Err::Incomplete(Needed::Size(n)) => format!("needed {} more bytes", n), + nom::Err::Error(e) | nom::Err::Failure(e) => convert_error(input, e), + } } diff --git a/src/bng/score/lex/lexer.rs b/src/bng/score/lex/lexer.rs index aa98244..ab0a316 100644 --- a/src/bng/score/lex/lexer.rs +++ b/src/bng/score/lex/lexer.rs @@ -9,9 +9,9 @@ use nom::{ branch::alt, bytes::complete::{take_till, take_till1}, character::complete::{anychar, char, one_of, space1, u16, u8}, - combinator::{map_opt, map_res, opt, value, verify}, + combinator::{all_consuming, map_opt, map_res, opt, value, verify}, error::{context, ContextError, ErrorKind, FromExternalError, ParseError}, - multi::many0, + multi::{many0, many1}, sequence::{delimited, pair, preceded, separated_pair, terminated}, Err, IResult, Parser, }; @@ -25,7 +25,27 @@ use super::{ #[cfg(test)] mod tests; -pub fn atom<'a, E>(notes: &'a str) -> impl Parser<&'a str, FlatAtom, E> +fn maybe_yml_str_space<'a, E>() -> impl Parser<&'a str, Vec, E> +where + E: nom::error::ParseError<&'a str> + ContextError<&'a str>, +{ + context("yml white space", many0(one_of(" \t\r\n"))) +} + +pub fn root<'a, E>(i: &'a str, notes: &'a str) -> IResult<&'a str, Vec, E> +where + E: ParseError<&'a str> + + ContextError<&'a str> + + FromExternalError<&'a str, TryFromIntError> + + FromExternalError<&'a str, E>, +{ + all_consuming(terminated( + many1(preceded(maybe_yml_str_space(), atom(notes))), + maybe_yml_str_space(), + ))(i) +} + +fn atom<'a, E>(notes: &'a str) -> impl Parser<&'a str, FlatAtom, E> where E: ParseError<&'a str> + ContextError<&'a str>