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