Skip to main content

doido_generators/commands/
dbconsole.rs

1//! `doido dbconsole` — open the database's native client for the configured URL
2//! (Rails `dbconsole`).
3
4use std::process::Command;
5
6/// Resolve the client program + args for a database URL, or `None` if unknown.
7pub fn client_command(database_url: &str) -> Option<(String, Vec<String>)> {
8    if let Some(path) = database_url
9        .strip_prefix("sqlite://")
10        .or_else(|| database_url.strip_prefix("sqlite:"))
11    {
12        Some(("sqlite3".to_string(), vec![path.to_string()]))
13    } else if database_url.starts_with("postgres://") || database_url.starts_with("postgresql://") {
14        Some(("psql".to_string(), vec![database_url.to_string()]))
15    } else if database_url.starts_with("mysql://") {
16        Some(("mysql".to_string(), vec![database_url.to_string()]))
17    } else {
18        None
19    }
20}
21
22/// Launch the client for `database_url`.
23pub fn run(database_url: &str) {
24    match client_command(database_url) {
25        Some((program, args)) => {
26            let _ = Command::new(program).args(args).status();
27        }
28        None => doido_core::tracing::error!("no known db client for URL: {database_url}"),
29    }
30}