use anyhow::{Context, Result as AnyResult};
use derive_builder::Builder;
use duct::cmd;
use serde::{Deserialize, Serialize};
#[derive(
Builder,
Debug,
Default,
PartialEq,
Eq,
Hash,
Clone,
Serialize,
Deserialize,
)]
#[builder(setter(into))]
pub struct CI {
#[builder(default = "false")]
pub nightly: bool,
#[builder(default = "true")]
pub clippy_max: bool,
}
impl CIBuilder {
pub fn run(&self) -> AnyResult<()> {
let CI {
nightly,
clippy_max,
} = self.build().context("Failed to build CI configuration")?;
if nightly {
cmd!(
"rustup", "run", "nightly", "cargo", "fmt", "--",
"--check"
)
.run()
.context(
"Failed to execute 'cargo fmt' with nightly compiler",
)?;
} else {
cmd!("cargo", "fmt", "--", "--check")
.run()
.context("Failed to execute 'cargo fmt'")?;
}
if clippy_max {
cmd!(
"cargo",
"clippy",
"--all-targets",
"--all-features",
"--",
"-D",
"warnings",
"-W",
"clippy::pedantic",
"-W",
"clippy::nursery"
)
.run()
.context("Failed to execute 'cargo clippy'")?;
} else {
cmd!("cargo", "clippy", "--", "-D", "warnings")
.run()
.context("Failed to execute 'cargo clippy'")?;
}
cmd!("cargo", "test")
.run()
.context("Failed to execute 'cargo test'")?;
Ok(())
}
}
pub fn ci() -> AnyResult<()> {
CIBuilder::default().run()
}