use super::{RawAtom, RawAtoms};
use winnow::ascii::{alphanumeric1, space0, space1};
use winnow::combinator::alt;
use winnow::combinator::cut_err;
use winnow::combinator::{delimited, separated};
use winnow::combinator::{not, opt, repeat, todo};
use winnow::prelude::*;
use winnow::stream::AsChar;
use winnow::token::take_till;
use winnow::token::take_while;
pub mod extxyz;
pub mod xyz;
use winnow::error::StrContext;
type Stream<'i> = &'i str;
fn label(s: &'static str) -> StrContext {
StrContext::Label(s)
}
pub fn recognize_unsigned_integer<'i>(input: &mut Stream<'i>) -> PResult<&'i str> {
use winnow::ascii::digit1;
use winnow::combinator::cut_err;
use winnow::token::one_of;
let r = cut_err(digit1).recognize().parse_next(input)?;
Ok(r)
}
pub fn recognize_boolean<'i>(input: &mut Stream<'i>) -> PResult<&'i str> {
let parse_true = alt(("true", "TRUE", "True", "T")).value("true");
let parse_false = alt(("false", "FALSE", "False", "F")).value("false");
alt((parse_true, parse_false)).parse_next(input)
}
pub fn recognize_integer<'i>(input: &mut Stream<'i>) -> PResult<&'i str> {
use winnow::ascii::digit1;
use winnow::combinator::cut_err;
use winnow::token::one_of;
let r = (opt(one_of(['+', '-'])), cut_err(digit1)).recognize().parse_next(input)?;
Ok(r)
}
pub fn recognize_sci_float<'i>(input: &mut Stream<'i>) -> PResult<String> {
use winnow::ascii::digit1;
use winnow::combinator::cut_err;
use winnow::combinator::preceded;
use winnow::stream::Located;
use winnow::token::one_of;
let pre_exponent = (
opt(one_of(['+', '-'])),
alt(((digit1, opt(('.', opt(digit1)))).map(|_| ()), ('.', digit1).map(|_| ()))),
)
.recognize()
.parse_next(input)?;
let float_s = if let Some(exponent) = opt(preceded(one_of(['e', 'E', 'D', 'd']), recognize_integer)).parse_next(input)? {
format!("{pre_exponent}E{exponent}")
} else {
format!("{pre_exponent}")
};
Ok(float_s)
}
#[test]
fn test_parse_value() -> PResult<()> {
let s = "+12";
let (_, v) = recognize_integer.try_map(|s| s.parse::<i32>()).parse_peek(s)?;
assert_eq!(v, 12);
let s = "-12";
let (_, v) = recognize_integer.try_map(|s| s.parse::<i32>()).parse_peek(s)?;
assert_eq!(v, -12);
let s = "-12.34d-1";
let (_, v) = recognize_sci_float.try_map(|s| s.parse::<f64>()).parse_peek(s)?;
assert_eq!(v, -1.234);
let s = "-12";
let (_, v) = recognize_sci_float.try_map(|s| s.parse::<f64>()).parse_peek(s)?;
assert_eq!(v, -12.0);
let s = "-12.3E-1";
let (_, v) = recognize_sci_float.try_map(|s| s.parse::<f64>()).parse_peek(s)?;
assert_eq!(v, -1.23);
Ok(())
}