esdl 0.6.0

Event-sourcing Schema Definition Language parser
Documentation
use std::str::FromStr;

use nom::{
    bytes::complete::is_not,
    character::complete::{char, space0},
    combinator::{map_res, recognize},
    sequence::{delimited, preceded, tuple},
};
use nom_supreme::tag::complete::tag;
use semver::Version;

use super::{event::Field, IResult, Span};

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CustomType<'i> {
    pub ident: Span<'i>,
    pub fields: Vec<Field<'i>>,
}

pub fn parse_version(input: Span) -> IResult<Span, Version> {
    map_res(
        preceded(
            tuple((tag("version"), space0, char('='), space0)),
            delimited(char('"'), recognize(is_not("\"")), char('"')),
        ),
        Version::from_str,
    )(input)
}

#[cfg(test)]
mod tests {
    use semver::Version;

    use super::parse_version;

    #[test]
    fn version() {
        assert_eq!(
            parse_version(r#"version="0.1.0""#).unwrap(),
            ("", Version::new(0, 1, 0))
        );
        assert_eq!(
            parse_version(r#"version   =  "123.456.789" hello"#).unwrap(),
            (" hello", Version::new(123, 456, 789))
        );
        assert!(parse_version(r#"version="0.1hi0""#).is_err());
    }
}