feat: wiki contents

This commit is contained in:
Cyborus 2024-08-05 13:40:49 -04:00
parent eadadf8dd8
commit 296ac0c853
No known key found for this signature in database

View file

@ -1,6 +1,11 @@
use clap::{Args, Subcommand}; use clap::{Args, Subcommand};
use eyre::OptionExt;
use forgejo_api::Forgejo;
use crate::repo::{RepoArg, RepoInfo}; use crate::{
repo::{RepoArg, RepoInfo, RepoName},
SpecialRender,
};
#[derive(Args, Clone, Debug)] #[derive(Args, Clone, Debug)]
pub struct WikiCommand { pub struct WikiCommand {
@ -12,7 +17,9 @@ pub struct WikiCommand {
} }
#[derive(Subcommand, Clone, Debug)] #[derive(Subcommand, Clone, Debug)]
pub enum WikiSubcommand {} pub enum WikiSubcommand {
Contents { repo: Option<RepoArg> },
}
impl WikiCommand { impl WikiCommand {
pub async fn run(self, keys: &mut crate::KeyInfo, host_name: Option<&str>) -> eyre::Result<()> { pub async fn run(self, keys: &mut crate::KeyInfo, host_name: Option<&str>) -> eyre::Result<()> {
@ -22,20 +29,44 @@ impl WikiCommand {
let api = keys.get_api(repo.host_url()).await?; let api = keys.get_api(repo.host_url()).await?;
let repo = repo.name().ok_or_else(|| self.no_repo_error())?; let repo = repo.name().ok_or_else(|| self.no_repo_error())?;
match self.command {} match self.command {
Contents { repo: _ } => wiki_contents(&repo, &api).await?,
}
Ok(())
} }
fn repo(&self) -> Option<&RepoArg> { fn repo(&self) -> Option<&RepoArg> {
use WikiSubcommand::*; use WikiSubcommand::*;
match &self.command { match &self.command {
_ => todo!(), Contents { repo } => repo.as_ref(),
} }
} }
fn no_repo_error(&self) -> eyre::Error { fn no_repo_error(&self) -> eyre::Error {
use WikiSubcommand::*; use WikiSubcommand::*;
match &self.command { match &self.command {
_ => todo!(), Contents { repo: _ } => eyre::eyre!("couldn't guess repo"),
} }
} }
} }
async fn wiki_contents(repo: &RepoName, api: &Forgejo) -> eyre::Result<()> {
let SpecialRender { bullet, .. } = *crate::special_render();
let query = forgejo_api::structs::RepoGetWikiPagesQuery {
page: None,
limit: None,
};
let pages = api
.repo_get_wiki_pages(repo.owner(), repo.name(), query)
.await?;
for page in pages {
let title = page
.title
.as_deref()
.ok_or_eyre("page does not have title")?;
println!("{bullet} {title}");
}
Ok(())
}