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#[derive(Debug, Clone)]
28pub struct AuthoraClient {
29 http: Arc<HttpClient>,
30}
31
32impl AuthoraClient {
33 pub fn new(api_key: &str) -> Result<Self, AuthoraError> {
38 Self::builder(api_key).build()
39 }
40
41 #[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 pub fn agents(&self) -> AgentsResource {
55 AgentsResource {
56 http: Arc::clone(&self.http),
57 }
58 }
59
60 pub fn roles(&self) -> RolesResource {
62 RolesResource {
63 http: Arc::clone(&self.http),
64 }
65 }
66
67 pub fn permissions(&self) -> PermissionsResource {
69 PermissionsResource {
70 http: Arc::clone(&self.http),
71 }
72 }
73
74 pub fn delegations(&self) -> DelegationsResource {
76 DelegationsResource {
77 http: Arc::clone(&self.http),
78 }
79 }
80
81 pub fn policies(&self) -> PoliciesResource {
83 PoliciesResource {
84 http: Arc::clone(&self.http),
85 }
86 }
87
88 pub fn mcp(&self) -> McpResource {
90 McpResource {
91 http: Arc::clone(&self.http),
92 }
93 }
94
95 pub fn audit(&self) -> AuditResource {
97 AuditResource {
98 http: Arc::clone(&self.http),
99 }
100 }
101
102 pub fn notifications(&self) -> NotificationsResource {
104 NotificationsResource {
105 http: Arc::clone(&self.http),
106 }
107 }
108
109 pub fn webhooks(&self) -> WebhooksResource {
111 WebhooksResource {
112 http: Arc::clone(&self.http),
113 }
114 }
115
116 pub fn alerts(&self) -> AlertsResource {
118 AlertsResource {
119 http: Arc::clone(&self.http),
120 }
121 }
122
123 pub fn api_keys(&self) -> ApiKeysResource {
125 ApiKeysResource {
126 http: Arc::clone(&self.http),
127 }
128 }
129
130 pub fn organizations(&self) -> OrganizationsResource {
132 OrganizationsResource {
133 http: Arc::clone(&self.http),
134 }
135 }
136
137 pub fn workspaces(&self) -> WorkspacesResource {
139 WorkspacesResource {
140 http: Arc::clone(&self.http),
141 }
142 }
143}
144
145#[must_use]
147#[derive(Debug)]
148pub struct AuthoraClientBuilder {
149 api_key: String,
150 base_url: String,
151 timeout: Duration,
152}
153
154impl AuthoraClientBuilder {
155 pub fn base_url(mut self, url: &str) -> Self {
157 self.base_url = url.to_string();
158 self
159 }
160
161 pub fn timeout(mut self, timeout: Duration) -> Self {
163 self.timeout = timeout;
164 self
165 }
166
167 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}