use std::{sync::Arc, time::Duration};
use crate::{
error::Result,
resources::{agents::AgentsResource, chat::ChatResource, conversations::ConversationsResource, cron::CronResource},
transport::Transport,
};
#[derive(Clone)]
pub struct LlmrixClient {
transport: Arc<Transport>,
}
impl LlmrixClient {
pub fn builder() -> ClientBuilder {
ClientBuilder::default()
}
pub fn conversations(&self) -> ConversationsResource {
ConversationsResource { t: Arc::clone(&self.transport) }
}
pub fn cron(&self) -> CronResource {
CronResource { t: Arc::clone(&self.transport) }
}
pub fn agents(&self) -> AgentsResource {
AgentsResource { t: Arc::clone(&self.transport) }
}
pub fn chat(&self, conv_id: impl Into<String>) -> ChatResource {
ChatResource { t: Arc::clone(&self.transport), conv_id: conv_id.into() }
}
}
#[derive(Default)]
pub struct ClientBuilder {
base_url: Option<String>,
api_key: String,
timeout: Option<Duration>,
}
impl ClientBuilder {
pub fn base_url(mut self, url: impl Into<String>) -> Self {
self.base_url = Some(url.into().trim_end_matches('/').to_string());
self
}
pub fn api_key(mut self, key: impl Into<String>) -> Self {
self.api_key = key.into();
self
}
pub fn timeout(mut self, d: Duration) -> Self {
self.timeout = Some(d);
self
}
pub fn build(self) -> Result<LlmrixClient> {
let base_url = self.base_url
.expect("LlmrixClient: base_url is required — call .base_url(\"http://...\")");
let timeout = self.timeout.unwrap_or(Duration::from_secs(60));
let transport = Transport::new(base_url, self.api_key, timeout)?;
Ok(LlmrixClient { transport: Arc::new(transport) })
}
}