diff options
author | Cyborus <cyborus@noreply.codeberg.org> | 2024-10-26 16:23:02 +0200 |
---|---|---|
committer | Cyborus <cyborus@noreply.codeberg.org> | 2024-10-26 16:23:02 +0200 |
commit | 884778f40167bf511f730872f8ee7f2825547c75 (patch) | |
tree | 787082ae42b8280ba8b17f1e1df44beda0cb61e0 | |
parent | Merge pull request 'add `--web` flag to `issue create`' (#136) from issue-cre... (diff) | |
parent | move `version` into a module (diff) | |
download | forgejo-cli-884778f40167bf511f730872f8ee7f2825547c75.tar.xz forgejo-cli-884778f40167bf511f730872f8ee7f2825547c75.zip |
Merge pull request 'move `whoami` and `version` into separate modules' (#137) from dataCobra/forgejo-cli:whoami into main
Reviewed-on: https://codeberg.org/Cyborus/forgejo-cli/pulls/137
-rw-r--r-- | src/main.rs | 83 | ||||
-rw-r--r-- | src/version.rs | 62 | ||||
-rw-r--r-- | src/whoami.rs | 29 |
3 files changed, 98 insertions, 76 deletions
diff --git a/src/main.rs b/src/main.rs index 495c971..b388fab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use std::io::IsTerminal; use clap::{Parser, Subcommand}; -use eyre::{eyre, Context, OptionExt}; +use eyre::eyre; use tokio::io::AsyncWriteExt; mod keys; @@ -13,6 +13,8 @@ mod prs; mod release; mod repo; mod user; +mod version; +mod whoami; mod wiki; #[derive(Parser, Debug)] @@ -33,20 +35,12 @@ pub enum Command { Pr(prs::PrCommand), Wiki(wiki::WikiCommand), #[command(name = "whoami")] - WhoAmI { - #[clap(long, short)] - remote: Option<String>, - }, + WhoAmI(whoami::WhoAmICommand), #[clap(subcommand)] Auth(auth::AuthCommand), Release(release::ReleaseCommand), User(user::UserCommand), - Version { - /// Checks for updates - #[clap(long)] - #[cfg(feature = "update-check")] - check: bool, - }, + Version(version::VersionCommand), } #[tokio::main] @@ -64,80 +58,17 @@ async fn main() -> eyre::Result<()> { Command::Issue(subcommand) => subcommand.run(&mut keys, host_name).await?, Command::Pr(subcommand) => subcommand.run(&mut keys, host_name).await?, Command::Wiki(subcommand) => subcommand.run(&mut keys, host_name).await?, - Command::WhoAmI { remote } => { - let url = repo::RepoInfo::get_current(host_name, None, remote.as_deref(), &keys) - .wrap_err("could not find host, try specifying with --host")? - .host_url() - .clone(); - let name = keys.get_login(&url).ok_or_eyre("not logged in")?.username(); - let host = url - .host_str() - .ok_or_eyre("instance url does not have host")?; - if url.path() == "/" || url.path().is_empty() { - println!("currently signed in to {name}@{host}"); - } else { - println!("currently signed in to {name}@{host}{}", url.path()); - } - } + Command::WhoAmI(command) => command.run(&mut keys, host_name).await?, Command::Auth(subcommand) => subcommand.run(&mut keys, host_name).await?, Command::Release(subcommand) => subcommand.run(&mut keys, host_name).await?, Command::User(subcommand) => subcommand.run(&mut keys, host_name).await?, - Command::Version { - #[cfg(feature = "update-check")] - check, - } => { - println!("{}", env!("CARGO_PKG_VERSION")); - #[cfg(feature = "update-check")] - update_msg(check).await?; - } + Command::Version(command) => command.run().await?, } keys.save().await?; Ok(()) } -#[cfg(feature = "update-check")] -async fn update_msg(check: bool) -> eyre::Result<()> { - use std::cmp::Ordering; - - if check { - let url = url::Url::parse("https://codeberg.org/")?; - let api = forgejo_api::Forgejo::new(forgejo_api::Auth::None, url)?; - - let latest = api - .repo_get_latest_release("Cyborus", "forgejo-cli") - .await?; - let latest_tag = latest - .tag_name - .ok_or_eyre("latest release does not have name")?; - let latest_ver = latest_tag - .strip_prefix("v") - .unwrap_or(&latest_tag) - .parse::<semver::Version>()?; - - let current_ver = env!("CARGO_PKG_VERSION").parse::<semver::Version>()?; - - match current_ver.cmp(&latest_ver) { - Ordering::Less => { - let latest_url = latest - .html_url - .ok_or_eyre("latest release does not have url")?; - println!("New version available: {latest_ver}"); - println!("Get it at {}", latest_url); - } - Ordering::Equal => { - println!("Up to date!"); - } - Ordering::Greater => { - println!("You are ahead of the latest published version"); - } - } - } else { - println!("Check for a new version with `fj version --check`"); - } - Ok(()) -} - async fn readline(msg: &str) -> eyre::Result<String> { use std::io::Write; print!("{msg}"); diff --git a/src/version.rs b/src/version.rs new file mode 100644 index 0000000..70cae8d --- /dev/null +++ b/src/version.rs @@ -0,0 +1,62 @@ +use clap::Args; +#[cfg(feature = "update-check")] +use eyre::OptionExt; + +#[derive(Args, Clone, Debug)] +pub struct VersionCommand { + /// Checks for updates + #[clap(long)] + #[cfg(feature = "update-check")] + check: bool, +} + +impl VersionCommand { + pub async fn run(self) -> eyre::Result<()> { + println!("{}", env!("CARGO_PKG_VERSION")); + #[cfg(feature = "update-check")] + self.update_msg().await?; + Ok(()) + } + + #[cfg(feature = "update-check")] + pub async fn update_msg(self) -> eyre::Result<()> { + use std::cmp::Ordering; + + if self.check { + let url = url::Url::parse("https://codeberg.org/")?; + let api = forgejo_api::Forgejo::new(forgejo_api::Auth::None, url)?; + + let latest = api + .repo_get_latest_release("Cyborus", "forgejo-cli") + .await?; + let latest_tag = latest + .tag_name + .ok_or_eyre("latest release does not have name")?; + let latest_ver = latest_tag + .strip_prefix("v") + .unwrap_or(&latest_tag) + .parse::<semver::Version>()?; + + let current_ver = env!("CARGO_PKG_VERSION").parse::<semver::Version>()?; + + match current_ver.cmp(&latest_ver) { + Ordering::Less => { + let latest_url = latest + .html_url + .ok_or_eyre("latest release does not have url")?; + println!("New version available: {latest_ver}"); + println!("Get it at {}", latest_url); + } + Ordering::Equal => { + println!("Up to date!"); + } + Ordering::Greater => { + println!("You are ahead of the latest published version"); + } + } + } else { + println!("Check for a new version with `fj version --check`"); + } + Ok(()) + } +} diff --git a/src/whoami.rs b/src/whoami.rs new file mode 100644 index 0000000..3d412d4 --- /dev/null +++ b/src/whoami.rs @@ -0,0 +1,29 @@ +use clap::{self, Args}; +use eyre::{Context, OptionExt}; + +use crate::{repo::RepoInfo, KeyInfo}; + +#[derive(Args, Clone, Debug)] +pub struct WhoAmICommand { + #[clap(long, short)] + remote: Option<String>, +} + +impl WhoAmICommand { + pub async fn run(self, keys: &mut KeyInfo, host_name: Option<&str>) -> eyre::Result<()> { + let url = RepoInfo::get_current(host_name, None, self.remote.as_deref(), &keys) + .wrap_err("could not find host, try specifying with --host")? + .host_url() + .clone(); + let name = keys.get_login(&url).ok_or_eyre("not logged in")?.username(); + let host = url + .host_str() + .ok_or_eyre("instance url does not have host")?; + if url.path() == "/" || url.path().is_empty() { + println!("currently signed in to {name}@{host}"); + } else { + println!("currently signed in to {name}@{host}{}", url.path()); + }; + Ok(()) + } +} |