use atuin_client::settings::Settings;
use clap::Subcommand;
use eyre::{Result, WrapErr};
use tracing::instrument;
use url::Url;
#[derive(Subcommand, Debug)]
pub enum Cmd {
Share {
#[arg(long)]
write: bool,
#[arg(long)]
yes: bool,
},
}
impl Cmd {
#[instrument(level = "trace", skip_all, err)]
pub async fn run(self, settings: &Settings) -> Result<()> {
match self {
Self::Share { write, yes } => {
let hub_url = lab_ws_url(settings)?;
let api_token = lab_api_token(settings).await?;
Ok(atuin_lab_share::run_share(atuin_lab_share::ShareOptions {
yes,
write,
hub_url,
api_token,
})
.await?)
}
}
}
}
fn lab_ws_url(settings: &Settings) -> Result<Url> {
if let Ok(u) = std::env::var("ATUIN_LAB_HUB_URL") {
return Url::parse(&u).wrap_err("ATUIN_LAB_HUB_URL is not a valid URL");
}
let mut url = settings.hub_endpoint();
let ws_scheme = if url.scheme() == "http" {
"ws"
} else {
"wss"
};
let _ = url.set_scheme(ws_scheme);
Ok(url)
}
async fn lab_api_token(settings: &Settings) -> Result<String> {
if let Ok(t) = std::env::var("ATUIN_LAB_HUB_TOKEN") {
return Ok(t);
}
settings
.hub_session_token()
.await
.wrap_err("not logged in to Atuin Hub -- run `atuin login` first")
}