spacetimedb_cli/subcommands/
list.rs1use 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}