cloud_terrastodon_entrypoint 0.36.0

Main entrypoint for the Cloud Terrastodon CLI
use clap::Args;
use cloud_terrastodon_gitea::GiteaRepoArgument;
use cloud_terrastodon_gitea::GiteaTenantArgument;
use cloud_terrastodon_gitea::GiteaTenantArgumentExt;
use cloud_terrastodon_gitea::fetch_all_gitea_repositories;
use cloud_terrastodon_gitea::fetch_gitea_repository;
use cloud_terrastodon_gitea::fetch_gitea_repository_by_id;
use eyre::Result;
use eyre::bail;
use std::io::Write;

#[derive(Args, Debug, Clone)]
pub struct GiteaRepoShowArgs {
    /// Repository id, full name, or name.
    pub repo: GiteaRepoArgument<'static>,

    /// Tracked tenant URL or alias to query. Defaults to the active `tea` login.
    #[arg(long, default_value_t)]
    pub tenant: GiteaTenantArgument<'static>,
}

impl GiteaRepoShowArgs {
    pub async fn invoke(self) -> Result<()> {
        let tenant = self.tenant.resolve().await?;
        let repository = match &self.repo {
            GiteaRepoArgument::Id(repo_id) => {
                fetch_gitea_repository_by_id(&tenant, *repo_id).await?
            }
            GiteaRepoArgument::IdRef(repo_id) => {
                fetch_gitea_repository_by_id(&tenant, **repo_id).await?
            }
            GiteaRepoArgument::FullName(full_name) => {
                fetch_gitea_repository(&tenant, full_name).await?
            }
            GiteaRepoArgument::FullNameRef(full_name) => {
                fetch_gitea_repository(&tenant, full_name).await?
            }
            GiteaRepoArgument::Name(_) | GiteaRepoArgument::NameRef(_) => {
                let repositories = fetch_all_gitea_repositories(&tenant).await?;
                let matches = repositories
                    .into_iter()
                    .filter(|repo| self.repo.matches(repo))
                    .collect::<Vec<_>>();
                match matches.as_slice() {
                    [repo] => repo.clone(),
                    [] => bail!("No Gitea repository found matching '{}'.", self.repo),
                    _ => bail!(
                        "Multiple Gitea repositories matched '{}'. Please specify the numeric id or owner/repo.",
                        self.repo
                    ),
                }
            }
        };
        let stdout = std::io::stdout();
        let mut handle = stdout.lock();
        serde_json::to_writer_pretty(&mut handle, &repository)?;
        handle.write_all(b"\n")?;
        Ok(())
    }
}