spacetimedb_cli/subcommands/
list.rs

1use crate::common_args;
2use crate::util;
3use crate::util::get_login_token_or_log_in;
4use crate::util::ResponseExt;
5use crate::util::UNSTABLE_WARNING;
6use crate::Config;
7use anyhow::Context;
8use clap::{ArgMatches, Command};
9use serde::Deserialize;
10use spacetimedb::Identity;
11use tabled::{
12    settings::{object::Columns, Alignment, Modify, Style},
13    Table, Tabled,
14};
15
16pub fn cli() -> Command {
17    Command::new("list")
18        .about(format!(
19            "Lists the databases attached to an identity. {}",
20            UNSTABLE_WARNING
21        ))
22        .arg(common_args::server().help("The nickname, host name or URL of the server from which to list databases"))
23        .arg(common_args::yes())
24}
25
26#[derive(Deserialize)]
27struct DatabasesResult {
28    pub identities: Vec<IdentityRow>,
29}
30
31#[derive(Tabled, Deserialize)]
32#[serde(transparent)]
33struct IdentityRow {
34    pub db_identity: Identity,
35}
36
37pub async fn exec(mut config: Config, args: &ArgMatches) -> Result<(), anyhow::Error> {
38    eprintln!("{}\n", UNSTABLE_WARNING);
39
40    let server = args.get_one::<String>("server").map(|s| s.as_ref());
41    let force = args.get_flag("force");
42    let token = get_login_token_or_log_in(&mut config, server, !force).await?;
43    let identity = util::decode_identity(&token)?;
44
45    let client = reqwest::Client::new();
46    let res = client
47        .get(format!(
48            "{}/v1/identity/{}/databases",
49            config.get_host_url(server)?,
50            identity
51        ))
52        .bearer_auth(token)
53        .send()
54        .await?;
55
56    let result: DatabasesResult = res
57        .json_or_error()
58        .await
59        .context("unable to retrieve databases for identity")?;
60
61    if !result.identities.is_empty() {
62        let mut table = Table::new(result.identities);
63        table
64            .with(Style::psql())
65            .with(Modify::new(Columns::first()).with(Alignment::left()));
66        println!("Associated database identities for {}:\n", identity);
67        println!("{}", table);
68    } else {
69        println!("No databases found for {}.", identity);
70    }
71
72    Ok(())
73}