bbcloud 0.10.0

Bitbucket Cloud CLI — open pull requests, read every comment, write replies, from the shell
Documentation
use crate::api::models::BranchRef;
use crate::commands::pr::Ctx;
use crate::error::Result;
use crate::output::{self, Format};
use serde::Serialize;

#[derive(Debug, Serialize)]
struct BranchRow {
    branch: String,
    user: String,
    updated: String,
}

pub async fn list(
    ctx: &Ctx,
    user: Option<String>,
    name: Option<String>,
    limit: usize,
) -> Result<()> {
    let spinner = output::spinner("fetching branches");
    let branches: Vec<BranchRef> = ctx
        .client
        .paginate(&ctx.path("/refs/branches?pagelen=100&sort=-target.date"))
        .await?;
    spinner.finish_and_clear();

    let user = user.map(|u| u.to_lowercase());
    let name = name.map(|n| n.to_lowercase());

    let rows: Vec<BranchRow> = branches
        .iter()
        .filter(|b| match &name {
            Some(needle) => b.name.to_lowercase().contains(needle),
            None => true,
        })
        .filter(|b| match &user {
            Some(needle) => b.owner().to_lowercase().contains(needle),
            None => true,
        })
        .take(limit)
        .map(|b| BranchRow {
            branch: b.name.clone(),
            user: b.owner(),
            updated: b
                .target
                .as_ref()
                .and_then(|t| t.date.as_deref())
                .map(output::relative_time)
                .unwrap_or_else(|| "-".into()),
        })
        .collect();

    match ctx.format {
        Format::Json => output::print_json(&rows)?,
        Format::Human => output::print_table(
            &["BRANCH", "LAST COMMIT BY", "UPDATED"],
            rows.iter()
                .map(|r| vec![r.branch.clone(), r.user.clone(), r.updated.clone()])
                .collect(),
        ),
    }

    Ok(())
}