diff --git a/src/cli/cmd/add/mod.rs b/src/cli/cmd/add/mod.rs index c493c8bd..3bb118c4 100644 --- a/src/cli/cmd/add/mod.rs +++ b/src/cli/cmd/add/mod.rs @@ -114,7 +114,7 @@ pub(crate) async fn load_flake( } #[tracing::instrument(skip_all)] -async fn infer_flake_input_name_url( +pub(crate) async fn infer_flake_input_name_url( api_addr: url::Url, flake_ref: String, input_name: Option, diff --git a/src/cli/cmd/get_url.rs b/src/cli/cmd/get_url.rs new file mode 100644 index 00000000..917150da --- /dev/null +++ b/src/cli/cmd/get_url.rs @@ -0,0 +1,30 @@ +use std::process::ExitCode; + +use clap::Parser; + +use super::CommandExecute; + +/// Prints the URL of a given FlakeHub flake +#[derive(Parser, Debug)] +pub(crate) struct GetURLSubcommand { + /// The FlakeHub reference to print as a URL + /// + /// A FlakeHub reference is of a form like `NixOS/nixpkgs` or `NixOS/nixpkgs/0.2305.*` + pub(crate) input_ref: String, + + #[clap(from_global)] + api_addr: url::Url, +} + +#[async_trait::async_trait] +impl CommandExecute for GetURLSubcommand { + async fn execute(self) -> color_eyre::Result { + let (_, flake_input_url) = + crate::cli::cmd::add::infer_flake_input_name_url(self.api_addr, self.input_ref, None) + .await?; + + println!("{}", flake_input_url); + + Ok(ExitCode::SUCCESS) + } +} diff --git a/src/cli/cmd/mod.rs b/src/cli/cmd/mod.rs index 6be19dc9..70e4e0f8 100644 --- a/src/cli/cmd/mod.rs +++ b/src/cli/cmd/mod.rs @@ -2,6 +2,7 @@ pub(crate) mod add; pub(crate) mod completion; pub(crate) mod convert; pub(crate) mod eject; +pub(crate) mod get_url; pub(crate) mod init; pub(crate) mod list; pub(crate) mod login; @@ -50,6 +51,7 @@ pub trait CommandExecute { #[derive(clap::Subcommand)] pub(crate) enum FhSubcommands { Add(add::AddSubcommand), + GetURL(get_url::GetURLSubcommand), Completion(completion::CompletionSubcommand), Init(init::InitSubcommand), List(list::ListSubcommand), diff --git a/src/main.rs b/src/main.rs index 558565f5..2f6086b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,6 +30,7 @@ async fn main() -> color_eyre::Result { match cli.subcommand { FhSubcommands::Add(add) => add.execute().await, + FhSubcommands::GetURL(get_url) => get_url.execute().await, FhSubcommands::Init(init) => init.execute().await, FhSubcommands::List(list) => list.execute().await, FhSubcommands::Search(search) => search.execute().await,