diff --git a/Cargo.toml b/Cargo.toml index c360204..8291a4b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,11 +5,15 @@ edition = "2021" [dependencies] anyhow = "1.0" +cfg-if = "1.0.0" clap = { version = "4.5", features = ["derive"] } fasteval = "0.2.4" tinyaudio = { version = "0.1", optional = true } [features] +# default = [] +# default = ["save"] +# default = ["play"] default = ["play", "save"] play = ["dep:tinyaudio"] save = [] diff --git a/src/cli.rs b/src/cli.rs index 0c6699a..e09a10b 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,21 +1,54 @@ use std::{fs::read_to_string, ops::Deref, path::Path, str::FromStr}; +cfg_if! { + if #[cfg(save)] { + use std::path::PathBuf; + } +} use anyhow::{Context, Error}; +use cfg_if::cfg_if; use clap::Parser; #[derive(Parser)] +#[cfg_attr(debug_assertions, derive(Debug))] pub(super) struct Args { #[arg(short, long, value_parser = Instrument::from_str)] - instrument: Instrument, + instrument: Option, + #[cfg(save)] + #[arg(short, long)] + output: Option, + #[cfg(play)] + #[arg(short, long)] + silent: bool, + score: Score, } -impl Args { - pub(super) fn instrument(&self) -> &::Target { - &self.instrument +#[derive(Clone)] +#[cfg_attr(debug_assertions, derive(Debug))] +pub(super) struct Score(String); + +impl FromStr for Score { + type Err = Error; + fn from_str(value: &str) -> Result { + let maybe_a_path = Path::new(&value); + Ok(Score(if maybe_a_path.is_file() { + read_to_string(maybe_a_path) + .context("you gave me the path of a real file but reading it is hard!")? + } else { + value.to_owned() // hope it's a good one + })) + } +} + +impl Deref for Score { + type Target = ::Target; + fn deref(&self) -> &Self::Target { + &self.0 } } #[derive(Clone)] +#[cfg_attr(debug_assertions, derive(Debug))] pub(super) struct Instrument(String); impl FromStr for Instrument { @@ -26,7 +59,7 @@ impl FromStr for Instrument { read_to_string(maybe_a_path) .context("you gave me the path of a real file but reading it is hard!")? } else { - value.to_owned() // hope it's good + value.to_owned() // hope it's a good one })) } } diff --git a/src/main.rs b/src/main.rs index 75aa9ce..d3528bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,7 @@ mod cli; fn main() -> Result<()> { let args = cli::Args::try_parse()?; - println!("got: {}", args.instrument()); + #[cfg(debug_assertions)] + println!("{:?}", args); Ok(()) }