use std::io::Write;
use sqlx::Database;
use crate::tenancy::error::TenancyError;
use crate::tenancy::manage::args::next_value;
use crate::tenancy::pools::TenantPools;
pub(super) async fn run_server_cmd<W: Write + Send, DB: Database>(
pools: &TenantPools<DB>,
registry_url: &str,
args: &[String],
w: &mut W,
) -> Result<(), TenancyError>
where
crate::sql::Pool: From<sqlx::Pool<DB>>,
{
let mut cfg = crate::tenancy::server::ServerConfig::from_env();
let mut iter = args.iter();
while let Some(flag) = iter.next() {
match flag.as_str() {
"--bind" => cfg.bind = next_value(&mut iter, "--bind")?,
"--apex" | "--apex-domain" => {
cfg.apex_domain = next_value(&mut iter, "--apex")?;
}
"--help" | "-h" => {
return Err(TenancyError::Validation(
"run-server [--bind <addr>] [--apex <domain>]\n \
Boots the operator console (apex) + tenant admin\n \
(subdomains) with sensible defaults. Reads RUSTANGO_BIND,\n \
RUSTANGO_APEX_DOMAIN, RUSTANGO_SESSION_SECRET from env.\n \
Ctrl-C to stop."
.into(),
));
}
other => {
return Err(TenancyError::Validation(format!(
"run-server: unknown argument `{other}`"
)));
}
}
}
let arc_pools = std::sync::Arc::new(TenantPools::<DB>::new(pools.registry_inner().clone()));
crate::tenancy::server::run::<DB, _>(arc_pools, registry_url.to_owned(), cfg, w).await
}