summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyborus <cyborus@cyborus.xyz>2024-09-23 17:16:08 +0200
committerCyborus <cyborus@cyborus.xyz>2024-09-23 19:33:07 +0200
commitce1ffa25c15ad58a86cbb152327d18b1244dd7e8 (patch)
tree68109532b7fd3663c93fe76ff030c3279be65a05
parentMerge pull request 'clean up urls better' (#126) from url-cleanup into main (diff)
downloadforgejo-cli-ce1ffa25c15ad58a86cbb152327d18b1244dd7e8.tar.xz
forgejo-cli-ce1ffa25c15ad58a86cbb152327d18b1244dd7e8.zip
feat: allow accessing public info without logging in
-rw-r--r--src/keys.rs25
-rw-r--r--src/main.rs2
2 files changed, 14 insertions, 13 deletions
diff --git a/src/keys.rs b/src/keys.rs
index e5fd6c5..5239df6 100644
--- a/src/keys.rs
+++ b/src/keys.rs
@@ -1,4 +1,5 @@
use eyre::eyre;
+use forgejo_api::{Auth, Forgejo};
use std::{collections::BTreeMap, io::ErrorKind};
use tokio::io::AsyncWriteExt;
use url::Url;
@@ -44,17 +45,17 @@ impl KeyInfo {
Ok(())
}
- pub fn get_login(&mut self, url: &Url) -> eyre::Result<&mut LoginInfo> {
+ pub fn get_login(&mut self, url: &Url) -> Option<&mut LoginInfo> {
let host = crate::host_with_port(url);
- let login_info = self
- .hosts
- .get_mut(host)
- .ok_or_else(|| eyre!("not signed in to {host}"))?;
- Ok(login_info)
+ let login_info = self.hosts.get_mut(host)?;
+ Some(login_info)
}
- pub async fn get_api(&mut self, url: &Url) -> eyre::Result<forgejo_api::Forgejo> {
- self.get_login(url)?.api_for(url).await.map_err(Into::into)
+ pub async fn get_api(&mut self, url: &Url) -> eyre::Result<Forgejo> {
+ match self.get_login(url) {
+ Some(login) => login.api_for(url).await,
+ None => Forgejo::new(Auth::None, url.clone()).map_err(Into::into),
+ }
}
pub fn deref_alias(&self, url: url::Url) -> url::Url {
@@ -96,10 +97,10 @@ impl LoginInfo {
}
}
- pub async fn api_for(&mut self, url: &Url) -> eyre::Result<forgejo_api::Forgejo> {
+ pub async fn api_for(&mut self, url: &Url) -> eyre::Result<Forgejo> {
match self {
LoginInfo::Application { token, .. } => {
- let api = forgejo_api::Forgejo::new(forgejo_api::Auth::Token(token), url.clone())?;
+ let api = Forgejo::new(Auth::Token(token), url.clone())?;
Ok(api)
}
LoginInfo::OAuth {
@@ -109,7 +110,7 @@ impl LoginInfo {
..
} => {
if time::OffsetDateTime::now_utc() >= *expires_at {
- let api = forgejo_api::Forgejo::new(forgejo_api::Auth::None, url.clone())?;
+ let api = Forgejo::new(Auth::None, url.clone())?;
let (client_id, client_secret) = crate::auth::get_client_info_for(url)
.ok_or_else(|| {
eyre::eyre!("Can't refresh token; no client info for {url}. How did this happen?")
@@ -130,7 +131,7 @@ impl LoginInfo {
);
*expires_at = time::OffsetDateTime::now_utc() + expires_in;
}
- let api = forgejo_api::Forgejo::new(forgejo_api::Auth::Token(token), url.clone())?;
+ let api = Forgejo::new(Auth::Token(token), url.clone())?;
Ok(api)
}
}
diff --git a/src/main.rs b/src/main.rs
index 5aaf2d0..06a9965 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -69,7 +69,7 @@ async fn main() -> eyre::Result<()> {
.wrap_err("could not find host, try specifying with --host")?
.host_url()
.clone();
- let name = keys.get_login(&url)?.username();
+ 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")?;