use crate::config::MeilisearchConfig;
use crate::error::{MeiliBridgeError, Result};
use meilisearch_sdk::{client::Client, errors::Error as MeilisearchError};
use std::sync::Arc;
use tracing::{debug, info};
#[derive(Clone)]
pub struct MeilisearchClient {
inner: Arc<Client>,
config: MeilisearchConfig,
}
impl MeilisearchClient {
pub fn new(config: MeilisearchConfig) -> Result<Self> {
let client = Client::new(&config.url, config.api_key.as_deref()).map_err(convert_error)?;
Ok(Self {
inner: Arc::new(client),
config,
})
}
pub fn client(&self) -> &Client {
&self.inner
}
pub async fn test_connection(&self) -> Result<()> {
info!("Testing connection to Meilisearch at {}", self.config.url);
match self.inner.health().await {
Ok(health) => {
debug!("Meilisearch health: {:?}", health);
info!("Successfully connected to Meilisearch");
Ok(())
}
Err(e) => Err(MeiliBridgeError::Meilisearch(format!(
"Failed to connect to Meilisearch: {}",
e
))),
}
}
pub async fn get_version(&self) -> Result<String> {
match self.inner.get_version().await {
Ok(version) => Ok(version.pkg_version),
Err(e) => Err(convert_error(e)),
}
}
}
pub fn convert_error(error: MeilisearchError) -> MeiliBridgeError {
MeiliBridgeError::Meilisearch(format!("{:?}", error))
}