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::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}