From 2cf2cd9dc7fc1ca709fbf04ef29b1108ad435366 Mon Sep 17 00:00:00 2001 From: Eric Rodrigues Pires Date: Sat, 3 Oct 2026 11:54:46 -0300 Subject: [PATCH] Use builder for NowEnvironment and remove Serialize for SecretString --- Cargo.lock | 74 ++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/command.rs | 7 ++++- src/environment.rs | 20 ++++++++++--- src/main.rs | 38 +++++++++++++----------- src/project.rs | 15 ++++++---- src/secret.rs | 11 +------ 7 files changed, 128 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f966ac8..d90cd17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -345,6 +345,29 @@ dependencies = [ "piper", ] +[[package]] +name = "bon" +version = "3.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "214f5df094ce551a10a30ffb9c70243d61f121a3d985a6495933e181dee6a7d2" +dependencies = [ + "bon-macros", +] + +[[package]] +name = "bon-macros" +version = "3.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2706da6c749998cc555d04184909608956a69ad3f8ab1a076fbc867b4a3c3ce5" +dependencies = [ + "darling", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "syn 3.0.6", +] + [[package]] name = "bstr" version = "1.13.0" @@ -589,6 +612,40 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "darling" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.6", +] + +[[package]] +name = "darling_macro" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" +dependencies = [ + "darling_core", + "quote", + "syn 3.0.6", +] + [[package]] name = "decorum" version = "0.4.0" @@ -977,6 +1034,12 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "ignore" version = "0.4.30" @@ -1168,6 +1231,7 @@ dependencies = [ "ahash", "async-trait", "base64 0.23.1", + "bon", "clap", "clap_complete", "color-eyre", @@ -1392,6 +1456,16 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "prettyplease" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bfe0f4c752e450fc2faf62654f1c134747922825d5b04ca717b8874f41a40c0" +dependencies = [ + "proc-macro2", + "syn 3.0.6", +] + [[package]] name = "proc-macro2" version = "1.0.106" diff --git a/Cargo.toml b/Cargo.toml index 37bb4f6..07e3217 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ path = "src/main.rs" ahash = "0.8.12" async-trait = "0.1.91" base64 = "0.23.1" +bon = "3.10.2" clap = { version = "4.6.1", features = ["derive", "unstable-ext"] } clap_complete = { version = "4.6.8", features = ["unstable-dynamic"] } color-eyre = "0.6.5" diff --git a/src/command.rs b/src/command.rs index 7561fb1..3bb094d 100644 --- a/src/command.rs +++ b/src/command.rs @@ -286,7 +286,12 @@ fn job_completer() -> Vec { let _ = sender.try_send(()); }); - let environment = smol::block_on(NowEnvironment::get(&workflow, ctrl_c, None, None, None))?; + let environment = smol::block_on( + NowEnvironment::builder() + .workflow(&workflow) + .ctrl_c(ctrl_c) + .build(), + )?; let mut jobs_iter = jobs_iter.rev(); let current_job = jobs_iter.next(); diff --git a/src/environment.rs b/src/environment.rs index ddb7a5f..82ed672 100644 --- a/src/environment.rs +++ b/src/environment.rs @@ -32,7 +32,7 @@ use tracing::instrument; use crate::{ command::TracingMode, - project::{ProjectSource, create_nix_project_source}, + project::ProjectSource, secret::SecretString, utils::{parse_bool_from_bytes, wait_for_output, write_output_to_stderr}, workflow::{NowJob, NowJobContainer, NowStepEnvVar, NowWorkflow, WorkflowSource}, @@ -101,13 +101,25 @@ struct ParsedWorkflow { jobs: BTreeMap, } +#[bon::bon] impl NowEnvironment { + #[builder] + pub(crate) fn new( + workflow: &WorkflowSource, + ctrl_c: Receiver<()>, + tracing: Option, + env_file: Option, + gcroot_dir: Option, + ) -> impl Future> { + Self::create(workflow, ctrl_c, tracing, env_file, gcroot_dir) + } + #[instrument(skip(ctrl_c))] - pub(crate) async fn get( + async fn create( workflow: &WorkflowSource, ctrl_c: Receiver<()>, tracing: Option, - env_file: Option<&PathBuf>, + env_file: Option, gcroot_dir: Option, ) -> color_eyre::Result { let mut env_vars: HashMap = HashMap::new(); @@ -128,7 +140,7 @@ impl NowEnvironment { Err(color_eyre::eyre::eyre!("Evaluation aborted")) }, async { - let nix_project_source = smol::unblock(create_nix_project_source).await?; + let nix_project_source = smol::unblock(ProjectSource::new).await?; let parsed_workflow = Self::parse_workflow(workflow, nix_project_source.as_ref()).await?; diff --git a/src/main.rs b/src/main.rs index 99986d8..b3ae19e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -196,13 +196,13 @@ fn main() -> color_eyre::Result<()> { let _ = sender.try_send(()); }); - let environment = smol::block_on(NowEnvironment::get( - &workflow, - ctrl_c, - None, - env_file.as_ref(), - None, - ))?; + let environment = smol::block_on( + NowEnvironment::builder() + .workflow(&workflow) + .ctrl_c(ctrl_c) + .maybe_env_file(env_file) + .build(), + )?; if tree { let workflow = smol::block_on(environment.evaluate_workflow(&workflow))?; @@ -245,8 +245,12 @@ fn main() -> color_eyre::Result<()> { })?; smol::block_on(async { - let environment = - NowEnvironment::get(&workflow, ctrl_c, None, env_file.as_ref(), None).await?; + let environment = NowEnvironment::builder() + .workflow(&workflow) + .ctrl_c(ctrl_c) + .maybe_env_file(env_file) + .build() + .await?; let evaluated = environment.evaluate_workflow(&workflow).await?; println!("{}", serde_json::to_string(&evaluated)?); Ok::<(), color_eyre::Report>(()) @@ -317,14 +321,14 @@ fn main() -> color_eyre::Result<()> { }; smol::block_on::>(async { - let mut environment = NowEnvironment::get( - &workflow, - ctrl_c.clone(), - tracing, - env_file.as_ref(), - gcroot_dir, - ) - .await?; + let mut environment = NowEnvironment::builder() + .workflow(&workflow) + .ctrl_c(ctrl_c.clone()) + .maybe_tracing(tracing) + .maybe_env_file(env_file) + .maybe_gcroot_dir(gcroot_dir) + .build() + .await?; environment .run_workflow(NowWorkflowParams { workflow, diff --git a/src/project.rs b/src/project.rs index 7b6904f..5985fae 100644 --- a/src/project.rs +++ b/src/project.rs @@ -42,12 +42,15 @@ impl Drop for ProjectSource { } } -pub(crate) fn create_nix_project_source() -> color_eyre::Result { - let project_source = ProjectSource(temp_dir().join(format!("now-{}", get_random_string(10)))); +impl ProjectSource { + pub(crate) fn new() -> color_eyre::Result { + let project_source = + ProjectSource(temp_dir().join(format!("now-{}", get_random_string(10)))); - let tar = GzDecoder::new(PROJECT_ARCHIVE); - let mut archive = Archive::new(tar); - archive.unpack(&project_source.0)?; + let tar = GzDecoder::new(PROJECT_ARCHIVE); + let mut archive = Archive::new(tar); + archive.unpack(&project_source.0)?; - Ok(project_source) + Ok(project_source) + } } diff --git a/src/secret.rs b/src/secret.rs index 096de72..f9a219a 100644 --- a/src/secret.rs +++ b/src/secret.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License along // with this program. If not, see . -use serde::{Deserialize, Serialize}; +use serde::Deserialize; pub(crate) struct SecretString(String); @@ -34,15 +34,6 @@ impl std::fmt::Debug for SecretString { } } -impl Serialize for SecretString { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - serializer.serialize_str(&self.0) - } -} - impl<'de> Deserialize<'de> for SecretString { fn deserialize(deserializer: D) -> Result where -- knotmirror 0.0.1