Skip to main content

authora/
client.rs

1use std::sync::Arc;
2use std::time::Duration;
3
4use crate::error::AuthoraError;
5use crate::http::HttpClient;
6use crate::resources::agents::AgentsResource;
7use crate::resources::alerts::AlertsResource;
8use crate::resources::api_keys::ApiKeysResource;
9use crate::resources::audit::AuditResource;
10use crate::resources::delegations::DelegationsResource;
11use crate::resources::mcp::McpResource;
12use crate::resources::notifications::NotificationsResource;
13use crate::resources::organizations::OrganizationsResource;
14use crate::resources::permissions::PermissionsResource;
15use crate::resources::policies::PoliciesResource;
16use crate::resources::roles::RolesResource;
17use crate::resources::webhooks::WebhooksResource;
18use crate::resources::workspaces::WorkspacesResource;
19
20const DEFAULT_BASE_URL: &str = "https://api.authora.dev/api/v1";
21const DEFAULT_TIMEOUT_SECS: u64 = 30;
22
23/// The main client for interacting with the Authora API.
24///
25/// Create one via [`AuthoraClient::new`] (defaults) or [`AuthoraClient::builder`]
26/// (custom configuration).
27#[derive(Debug, Clone)]
28pub struct AuthoraClient {
29    http: Arc<HttpClient>,
30}
31
32impl AuthoraClient {
33    /// Create a client with default settings.
34    ///
35    /// Uses `https://api.authora.dev/api/v1` as the base URL and a 30-second
36    /// request timeout.
37    pub fn new(api_key: &str) -> Result<Self, AuthoraError> {
38        Self::builder(api_key).build()
39    }
40
41    /// Return a builder for fine-grained configuration.
42    #[must_use]
43    pub fn builder(api_key: &str) -> AuthoraClientBuilder {
44        AuthoraClientBuilder {
45            api_key: api_key.to_string(),
46            base_url: DEFAULT_BASE_URL.to_string(),
47            timeout: Duration::from_secs(DEFAULT_TIMEOUT_SECS),
48        }
49    }
50
51    // -- resource accessors ---------------------------------------------------
52
53    /// Access agent operations.
54    pub fn agents(&self) -> AgentsResource {
55        AgentsResource {
56            http: Arc::clone(&self.http),
57        }
58    }
59
60    /// Access role operations.
61    pub fn roles(&self) -> RolesResource {
62        RolesResource {
63            http: Arc::clone(&self.http),
64        }
65    }
66
67    /// Access permission-check operations.
68    pub fn permissions(&self) -> PermissionsResource {
69        PermissionsResource {
70            http: Arc::clone(&self.http),
71        }
72    }
73
74    /// Access delegation operations.
75    pub fn delegations(&self) -> DelegationsResource {
76        DelegationsResource {
77            http: Arc::clone(&self.http),
78        }
79    }
80
81    /// Access policy operations.
82    pub fn policies(&self) -> PoliciesResource {
83        PoliciesResource {
84            http: Arc::clone(&self.http),
85        }
86    }
87
88    /// Access MCP operations.
89    pub fn mcp(&self) -> McpResource {
90        McpResource {
91            http: Arc::clone(&self.http),
92        }
93    }
94
95    /// Access audit operations.
96    pub fn audit(&self) -> AuditResource {
97        AuditResource {
98            http: Arc::clone(&self.http),
99        }
100    }
101
102    /// Access notification operations.
103    pub fn notifications(&self) -> NotificationsResource {
104        NotificationsResource {
105            http: Arc::clone(&self.http),
106        }
107    }
108
109    /// Access webhook operations.
110    pub fn webhooks(&self) -> WebhooksResource {
111        WebhooksResource {
112            http: Arc::clone(&self.http),
113        }
114    }
115
116    /// Access alert operations.
117    pub fn alerts(&self) -> AlertsResource {
118        AlertsResource {
119            http: Arc::clone(&self.http),
120        }
121    }
122
123    /// Access API key operations.
124    pub fn api_keys(&self) -> ApiKeysResource {
125        ApiKeysResource {
126            http: Arc::clone(&self.http),
127        }
128    }
129
130    /// Access organization operations.
131    pub fn organizations(&self) -> OrganizationsResource {
132        OrganizationsResource {
133            http: Arc::clone(&self.http),
134        }
135    }
136
137    /// Access workspace operations.
138    pub fn workspaces(&self) -> WorkspacesResource {
139        WorkspacesResource {
140            http: Arc::clone(&self.http),
141        }
142    }
143}
144
145/// Builder for [`AuthoraClient`].
146#[must_use]
147#[derive(Debug)]
148pub struct AuthoraClientBuilder {
149    api_key: String,
150    base_url: String,
151    timeout: Duration,
152}
153
154impl AuthoraClientBuilder {
155    /// Override the base URL (default: `https://api.authora.dev/api/v1`).
156    pub fn base_url(mut self, url: &str) -> Self {
157        self.base_url = url.to_string();
158        self
159    }
160
161    /// Override the request timeout (default: 30 s).
162    pub fn timeout(mut self, timeout: Duration) -> Self {
163        self.timeout = timeout;
164        self
165    }
166
167    /// Build the client.
168    pub fn build(self) -> Result<AuthoraClient, AuthoraError> {
169        let http = HttpClient::new(&self.api_key, &self.base_url, self.timeout)?;
170        Ok(AuthoraClient {
171            http: Arc::new(http),
172        })
173    }
174}