diff --git a/Cargo.toml b/Cargo.toml index eb5770e..1001ccb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,8 @@ path = "src/cli/main.rs" [dependencies] anyhow = "1.0.98" clap = { version = "4.5.38", features = ["derive"] } -fasteval = "0.2.4" +derive_builder = "0.20.2" +fasteval = { git = "https://github.com/brevalferrari/fasteval" } flacenc = "0.4.0" hound = "3.5.1" mp3lame-encoder = { version = "0.2.1", features = ["std"] } diff --git a/src/compiler.rs b/src/compiler.rs new file mode 100644 index 0000000..046f42e --- /dev/null +++ b/src/compiler.rs @@ -0,0 +1,50 @@ +use std::collections::HashMap; + +use fasteval::Instruction; + +pub type TokenVec = Vec>; + +pub trait Token { + fn apply(&self, context: Context) -> Context; +} + +#[cfg_attr(debug_assertions, derive(Default))] +#[derive(Clone, Copy)] +pub struct Silence; + +#[cfg_attr(debug_assertions, derive(Default))] +#[derive(Clone, Copy)] +pub struct Marker; + +#[cfg_attr(debug_assertions, derive(Default))] +#[derive(Clone, Copy)] +pub struct Note(pub u8); + +#[cfg_attr(debug_assertions, derive(Default))] +#[derive(Clone)] +pub struct VariableChange(pub char, pub Instruction); + +#[cfg_attr(debug_assertions, derive(Default))] +pub struct Loop(pub usize, pub TokenVec); + +#[cfg_attr(debug_assertions, derive(Default))] +pub struct Tuplet(pub TokenVec); + +#[cfg_attr(debug_assertions, derive(Default))] +pub struct Slope(pub VariableChange, pub TokenVec); + +pub struct Context { + pub result: Vec, + pub variables: HashMap, + pub instrument: Instruction, + pub slopes: HashMap, +} + +impl Context { + pub fn current_length(&self) -> f64 { + todo!() + } + pub fn render(&self, n: Option) -> Vec { + todo!() + } +} diff --git a/src/lib.rs b/src/lib.rs index ae73c3e..b771520 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1 +1,2 @@ -pub struct Test; +pub mod compiler; +pub mod parser; diff --git a/src/parser.rs b/src/parser.rs new file mode 100644 index 0000000..98ac45e --- /dev/null +++ b/src/parser.rs @@ -0,0 +1,55 @@ +use std::collections::HashMap; + +use derive_builder::Builder; +use nom::{Compare, Input, combinator::success, error::Error}; +use nom_locate::LocatedSpan; + +use crate::compiler::{Marker, Note, Silence, Token, VariableChange}; + +pub trait TokenParser: + nom::Parser, Output = O, Error = Error>> +{ +} + +impl TokenParser for T where + T: nom::Parser, Output = O, Error = Error>> +{ +} + +pub struct ParserParametters<'n, 's, 'v, I: Input + Clone + Compare, C: Into> { + pub notes: &'n [I], + pub slopes: &'s HashMap, + pub variables: &'v [C], +} + +#[derive(Builder)] +pub struct Parser<'i, 'n, 's, 'v, I: Input + Clone + Compare, C: Into> { + input: &'i I, + notes: &'n [I], + slopes: &'s HashMap, + variables: &'v [C], +} + +impl<'i, 'n, 's, 'v, I: Input + Clone + Compare, C: Into> Parser<'i, 'n, 's, 'v, I, C> { + pub fn parse_all() -> Result>, Error>> { + todo!() + } +} + +impl Silence { + fn parser() -> impl TokenParser { + success(Default::default()) + } +} + +impl Marker { + fn parser() -> impl TokenParser { + success(Default::default()) + } +} + +impl Note { + fn parser() -> impl TokenParser { + success(Default::default()) + } +}