use crate::error::IdlcResult;
use clap::Args;
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum)]
enum FormatLang {
Idl,
#[value(aliases = ["rs"])]
Rust,
#[value(aliases = ["ts"])]
Typescript,
#[value(aliases=["j2", "jinja2"])]
Jinja,
}
#[derive(Debug, Args)]
pub struct ArgsFormat {
#[arg(long = "lang", short = 'l', value_enum, default_value_t = FormatLang::Idl)]
lang: FormatLang,
#[arg(long, short = 'i')]
inplace: bool,
#[arg(required = true)]
files: Vec<PathBuf>,
}
impl ArgsFormat {
pub fn execute(self) -> IdlcResult<()> {
for file in self.files.iter() {
let source = std::fs::read_to_string(file)?;
let formatted = match self.lang {
FormatLang::Idl => crate::fmt::format_idl_source_with_name(
&source,
file.to_string_lossy().as_ref(),
)?,
FormatLang::Rust => crate::fmt::format_rust_source(&source)?,
FormatLang::Typescript => crate::fmt::format_typescript_source(&source)?,
FormatLang::Jinja => crate::fmt::format_jinja_source(&source)?,
};
if self.inplace {
std::fs::write(file, formatted)?;
} else {
print!("{}", formatted);
}
}
Ok(())
}
}