From 903e3ebc64956ab408714fe7f1758e89e2076af8 Mon Sep 17 00:00:00 2001 From: p6nj Date: Wed, 2 Oct 2024 11:21:58 -0400 Subject: [PATCH] adapt cli to new yml system --- src/cli.rs | 60 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 5057a49..1bba81e 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,5 +1,6 @@ -use std::path::PathBuf; +use std::{fmt::Display, fs::read_to_string, io, str::FromStr}; +use amplify::{From, Wrapper}; use clap::Parser; /// Cli entry point @@ -8,9 +9,9 @@ use clap::Parser; pub enum BngCli { /// Play the song through default sink Play(PlayOpts), - /// Export the song to a sound file + /// Export the song to a sound FileContents Export(ExportOpts), - /// List supported sound file extensions and instrument / song available expressions + /// List supported sound FileContents extensions and instrument / song available expressions #[command(subcommand)] List(ListOpts), } @@ -19,24 +20,27 @@ pub enum BngCli { #[derive(Clone, Parser)] #[cfg_attr(debug_assertions, derive(Debug))] pub struct PlayOpts { - input: PathBuf, + #[arg(value_parser = FileContents::from_str)] + input: FileContents, } /// [`BngCli`] "export" command options #[derive(Clone, Parser)] #[cfg_attr(debug_assertions, derive(Debug))] pub struct ExportOpts { - /// Input file (written song file) - input: PathBuf, - /// Output file (sound file) - output: PathBuf, + /// Input FileContents (written song FileContents) + #[arg(value_parser = FileContents::from_str)] + input: FileContents, + /// Output FileContents (sound FileContents) + #[arg(value_parser = AudioFileName::from_str)] + output: AudioFileName, } /// [`BngCli`] "list" command sub-commands #[derive(Clone, Parser)] #[cfg_attr(debug_assertions, derive(Debug))] pub enum ListOpts { - /// List supported sound file extensions to export songs + /// List supported sound FileContents extensions to export songs #[command(subcommand)] Extensions, /// List available math expressions for instrument definition @@ -46,3 +50,41 @@ pub enum ListOpts { #[command(subcommand)] Glyphs, } + +#[derive(Clone, Wrapper, From)] +#[wrapper(Deref)] +#[cfg_attr(debug_assertions, derive(Debug))] +pub struct FileContents(String); + +impl FromStr for FileContents { + type Err = io::Error; + fn from_str(s: &str) -> Result { + read_to_string(s).map(Into::into) + } +} + +#[derive(Clone, Wrapper, From)] +#[wrapper(Deref)] +#[cfg_attr(debug_assertions, derive(Debug))] +pub struct AudioFileName(String); + +#[derive(Debug)] +pub struct UnsupportedFileExtensionError; + +impl std::error::Error for UnsupportedFileExtensionError {} + +impl Display for UnsupportedFileExtensionError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "The extension of the selected output sound file is not supported." + ) + } +} + +impl FromStr for AudioFileName { + type Err = UnsupportedFileExtensionError; + fn from_str(s: &str) -> Result { + Ok(s.to_owned().into()) + } +}