diff --git a/crates/cli/src/cmd/build.rs b/crates/cli/src/cmd/build.rs index 51e974ea..b16a0140 100644 --- a/crates/cli/src/cmd/build.rs +++ b/crates/cli/src/cmd/build.rs @@ -1,10 +1,7 @@ -use miette::IntoDiagnostic; -use project::{config::Config, Project}; -use std::env; use std::path::PathBuf; #[derive(clap::Args)] -/// Build an Aiken project at the given working directory. +/// Build an Aiken project pub struct Args { /// Path to project #[clap(short, long)] @@ -12,33 +9,5 @@ pub struct Args { } pub fn exec(Args { directory }: Args) -> miette::Result<()> { - let project_path = if let Some(d) = directory { - d - } else { - env::current_dir().into_diagnostic()? - }; - - let config = Config::load(project_path.clone()).into_diagnostic()?; - - let mut project = Project::new(config, project_path); - - let build_result = project.build(); - - let warning_count = project.warnings.len(); - - for warning in project.warnings { - warning.report() - } - - if let Err(err) = build_result { - err.report(); - - miette::bail!( - "failed: {} error(s), {warning_count} warning(s)", - err.total(), - ); - }; - - println!("finished with {warning_count} warning(s)"); - return Ok(()); + crate::with_project(directory, |p| p.build()) } diff --git a/crates/cli/src/cmd/check.rs b/crates/cli/src/cmd/check.rs index 0b20e975..9f99e617 100644 --- a/crates/cli/src/cmd/check.rs +++ b/crates/cli/src/cmd/check.rs @@ -1,12 +1,7 @@ -use miette::IntoDiagnostic; -use project::{config::Config, Project}; -use std::env; use std::path::PathBuf; -// TODO: Refactor this to remove logic duplication with the 'build command' - #[derive(clap::Args)] -/// Typecheck a project project +/// Type-check an Aiken project pub struct Args { /// Path to project #[clap(short, long)] @@ -14,33 +9,5 @@ pub struct Args { } pub fn exec(Args { directory }: Args) -> miette::Result<()> { - let project_path = if let Some(d) = directory { - d - } else { - env::current_dir().into_diagnostic()? - }; - - let config = Config::load(project_path.clone()).into_diagnostic()?; - - let mut project = Project::new(config, project_path); - - let build_result = project.check(); - - let warning_count = project.warnings.len(); - - for warning in project.warnings { - warning.report() - } - - if let Err(err) = build_result { - err.report(); - - miette::bail!( - "failed: {} error(s), {warning_count} warning(s)", - err.total(), - ); - }; - - println!("finished with {warning_count} warning(s)"); - return Ok(()); + crate::with_project(directory, |p| p.check()) } diff --git a/crates/cli/src/cmd/new.rs b/crates/cli/src/cmd/new.rs index 920aac1b..ab4ce26b 100644 --- a/crates/cli/src/cmd/new.rs +++ b/crates/cli/src/cmd/new.rs @@ -16,5 +16,5 @@ pub fn exec(Args { name }: Args) -> miette::Result<()> { fs::create_dir_all(name.join("scripts")).into_diagnostic()?; } - return Ok(()); + Ok(()) } diff --git a/crates/cli/src/cmd/tx/simulate.rs b/crates/cli/src/cmd/tx/simulate.rs index 380a88e0..8f7c4492 100644 --- a/crates/cli/src/cmd/tx/simulate.rs +++ b/crates/cli/src/cmd/tx/simulate.rs @@ -121,5 +121,5 @@ pub fn exec( } } - return Ok(()); + Ok(()) } diff --git a/crates/cli/src/cmd/uplc/eval.rs b/crates/cli/src/cmd/uplc/eval.rs index d55cf2eb..0f22cfee 100644 --- a/crates/cli/src/cmd/uplc/eval.rs +++ b/crates/cli/src/cmd/uplc/eval.rs @@ -71,5 +71,5 @@ pub fn exec(Args { script, flat, args }: Args) -> miette::Result<()> { println!("\nLogs\n----\n{}", logs.join("\n")) } - return Ok(()); + Ok(()) } diff --git a/crates/cli/src/cmd/uplc/flat.rs b/crates/cli/src/cmd/uplc/flat.rs index 2412994b..e7efe84c 100644 --- a/crates/cli/src/cmd/uplc/flat.rs +++ b/crates/cli/src/cmd/uplc/flat.rs @@ -79,5 +79,5 @@ pub fn exec( } } - return Ok(()); + Ok(()) } diff --git a/crates/cli/src/cmd/uplc/fmt.rs b/crates/cli/src/cmd/uplc/fmt.rs index 7391e49a..c5bf026a 100644 --- a/crates/cli/src/cmd/uplc/fmt.rs +++ b/crates/cli/src/cmd/uplc/fmt.rs @@ -26,5 +26,5 @@ pub fn exec(Args { input, print }: Args) -> miette::Result<()> { fs::write(&input, pretty).into_diagnostic()?; } - return Ok(()); + Ok(()) } diff --git a/crates/cli/src/cmd/uplc/unflat.rs b/crates/cli/src/cmd/uplc/unflat.rs index 3f9abb6b..b45c4721 100644 --- a/crates/cli/src/cmd/uplc/unflat.rs +++ b/crates/cli/src/cmd/uplc/unflat.rs @@ -57,5 +57,5 @@ pub fn exec( fs::write(&out_name, pretty).into_diagnostic()?; } - return Ok(()); + Ok(()) } diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs new file mode 100644 index 00000000..84e28b39 --- /dev/null +++ b/crates/cli/src/lib.rs @@ -0,0 +1,41 @@ +pub mod cmd; + +use miette::IntoDiagnostic; +use project::{config::Config, Project}; +use std::env; +use std::path::PathBuf; + +pub fn with_project(directory: Option, mut action: A) -> miette::Result<()> +where + A: FnMut(&mut Project) -> Result<(), project::error::Error>, +{ + let project_path = if let Some(d) = directory { + d + } else { + env::current_dir().into_diagnostic()? + }; + + let config = Config::load(project_path.clone()).into_diagnostic()?; + + let mut project = Project::new(config, project_path); + + let build_result = action(&mut project); + + let warning_count = project.warnings.len(); + + for warning in project.warnings { + warning.report() + } + + if let Err(err) = build_result { + err.report(); + + miette::bail!( + "failed: {} error(s), {warning_count} warning(s)", + err.total(), + ); + }; + + println!("finished with {warning_count} warning(s)"); + Ok(()) +} diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 1862a501..70d150e7 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1,7 +1,5 @@ -mod cmd; - +use aiken::cmd::{build, check, new, tx, uplc}; use clap::Parser; -use cmd::{build, check, new, tx, uplc}; /// Aiken: a smart-contract language and toolchain for Cardano #[derive(Parser)]