diff --git a/CHANGELOG.md b/CHANGELOG.md index ed38d46..e7ec264 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - Support having a `#!` inside a haze script to specify the interpreter to use - Add webui for accessing the database. +- Allow opening services with `haze open [service]` ## 2.4.1 diff --git a/src/args.rs b/src/args.rs index 7e28603..7bec3c1 100644 --- a/src/args.rs +++ b/src/args.rs @@ -64,6 +64,7 @@ pub enum HazeArgs { }, Open { filter: Option, + service: Option, }, Fmt { path: String, @@ -317,7 +318,21 @@ impl HazeArgs { .into_diagnostic()?, }) } - HazeCommand::Open => Ok(HazeArgs::Open { filter }), + HazeCommand::Open => { + let mut args = args.peekable(); + let service = match args.peek() { + Some(arg) => Service::from_type(&[], arg.as_ref()) + .into_iter() + .filter_map(|services| services.into_iter().next()) + .next() + .map(|service| { + args.next(); + service + }), + _ => None, + }; + Ok(HazeArgs::Open { filter, service }) + } HazeCommand::Fmt => { let path = args .next() @@ -472,6 +487,7 @@ pub enum HazeCommand { ))] Logs, /// Open an instance in the browser + #[strum(props(Args = "[service] service to open, instead of the Nextcloud instance"))] Open, /// Run code formatting from a new instance #[strum(props(Args = "[path] path to format"))] diff --git a/src/main.rs b/src/main.rs index d425a73..2677db1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -286,11 +286,26 @@ async fn main() -> Result { .await?; } } - HazeArgs::Open { filter } => { + HazeArgs::Open { filter, service } => { let cloud = Cloud::get_by_filter(&docker, filter, &config).await?; - match cloud.ip { - Some(_) => opener::open(cloud.address).into_diagnostic()?, - None => eprintln!("{} is not running", cloud.id), + match service { + Some(service) => { + let Some(ip) = service.get_ips(&docker, &cloud.id).await?.next() else { + eprintln!( + "Service {} can't be opened as it has no associated IP", + service.name() + ); + return Ok(ExitCode::FAILURE); + }; + let addr = config + .proxy + .addr(&format!("{}-{}", &cloud.id, service.name()), ip); + opener::open(addr).into_diagnostic()?; + } + None => match cloud.ip { + Some(_) => opener::open(cloud.address).into_diagnostic()?, + None => eprintln!("{} is not running", cloud.id), + }, } } HazeArgs::Test { options, mut args } => {