use crate::{wr, ParseContainer};
use nom::bytes::complete::take_while1;
use nom::character::is_alphanumeric;
use nom::IResult;
#[derive(Clone, Debug)]
pub struct DiagramIdToken {
id: ParseContainer,
}
impl DiagramIdToken {
pub fn parse(input: ParseContainer) -> IResult<ParseContainer, (ParseContainer, Self)> {
let (rest, id) = wr!(take_while1(|c: char| is_alphanumeric(c as u8) || '_' == c))(input)?;
Ok((rest, (id.clone(), Self { id })))
}
pub fn id(&self) -> &str {
self.id.as_str()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse() -> anyhow::Result<()> {
assert!(DiagramIdToken::parse("".into()).is_err());
assert!(DiagramIdToken::parse(" ".into()).is_err());
let testdata = "aaa ";
let (rest, (parsed, id)) = DiagramIdToken::parse(testdata.into())?;
assert_eq!(rest, " ");
assert_eq!(parsed, "aaa");
assert_eq!(id.id(), "aaa");
Ok(())
}
}