libdaw 0.2.0

A library for Rust for making programmable DAWs
Documentation
use crate::{
    metronome::Beat,
    notation::{Chord, NotePitch},
    parse::IResult,
};
use nom::{
    branch::alt,
    bytes::complete::tag,
    character::complete::{multispace0, multispace1},
    combinator::{cut, opt},
    multi::separated_list1,
    sequence::preceded,
};

pub fn chord(input: &str) -> IResult<&str, Chord> {
    let (input, _) = alt((tag("="), tag("chord")))(input)?;
    let (input, _) = multispace0(input)?;
    let (input, _) = cut(tag("("))(input)?;
    let (input, _) = multispace0(input)?;
    let (input, pitches) = cut(separated_list1(multispace1, NotePitch::parse))(input)?;
    let (input, _) = multispace0(input)?;
    let (input, _) = cut(tag(")"))(input)?;
    let (input, length) = opt(preceded(tag(","), Beat::parse))(input)?;
    let (input, duration) = opt(preceded(tag(","), Beat::parse))(input)?;
    Ok((
        input,
        Chord {
            pitches,
            length,
            duration,
        },
    ))
}