Build a [`StorageClient`] and return the resolved org slug alongside it. Useful for commands that also need to resolve org-scoped state (e.g. per-org default workspace lookup). Avoids resolving the org twice.
(
org_override: Option<&str>,
server_override: Option<&str>,
)
| 63 | /// Useful for commands that also need to resolve org-scoped state (e.g. |
| 64 | /// per-org default workspace lookup). Avoids resolving the org twice. |
| 65 | pub async fn build_client_with_org( |
| 66 | org_override: Option<&str>, |
| 67 | server_override: Option<&str>, |
| 68 | ) -> CliResult<(StorageClient, String)> { |
| 69 | let config = GlobalConfig::load() |
| 70 | .map_err(|e| CliError::Internal(anyhow::anyhow!("Failed to load global config: {}", e)))?; |
| 71 | |
| 72 | // Resolve the server profile (named or legacy). |
| 73 | let server = config |
| 74 | .resolve_server(server_override) |
| 75 | .map_err(|e| CliError::Internal(anyhow::anyhow!("{}", e)))? |
| 76 | .0; |
| 77 | |
| 78 | let server_url = server.url.clone().ok_or_else(|| { |
| 79 | let hint = if let Some(name) = server_override { |
| 80 | format!("Server profile '{}' has no URL configured.", name) |
| 81 | } else { |
| 82 | "Server not configured. Run 'atomic identity register <server-url>' first.".to_string() |
| 83 | }; |
| 84 | CliError::Internal(anyhow::anyhow!("{}", hint)) |
| 85 | })?; |
| 86 | |
| 87 | let org_slug = resolve_org_with_server(org_override, server)?; |
| 88 | |
| 89 | let base_url = server.org_base_url(&org_slug).ok_or_else(|| { |
| 90 | CliError::Internal(anyhow::anyhow!( |
| 91 | "Could not build org URL from server config" |
| 92 | )) |
| 93 | })?; |
| 94 | |
| 95 | // Resolve identity: per-server override → global default. |
| 96 | let store = IdentityStore::open_default() |
| 97 | .map_err(|e| CliError::Internal(anyhow::anyhow!("Failed to open identity store: {}", e)))?; |
| 98 | |
| 99 | let identity = if let Some(ref identity_name) = server.identity { |
| 100 | // Server profile specifies an identity — use it. |
| 101 | store.load_by_name(identity_name).map_err(|e| { |
| 102 | CliError::Internal(anyhow::anyhow!( |
| 103 | "Identity '{}' specified by server profile not found: {}", |
| 104 | identity_name, |
| 105 | e |
| 106 | )) |
| 107 | })? |
| 108 | } else { |
| 109 | // Fall back to global default identity. |
| 110 | store |
| 111 | .get_default() |
| 112 | .map_err(|e| { |
| 113 | CliError::Internal(anyhow::anyhow!("Failed to load default identity: {}", e)) |
| 114 | })? |
| 115 | .ok_or_else(|| { |
| 116 | CliError::Internal(anyhow::anyhow!( |
| 117 | "No default identity set. Create one first:\n \ |
| 118 | atomic identity new <name> --email <email> --set-default" |
| 119 | )) |
| 120 | })? |
| 121 | }; |
| 122 |
no test coverage detected