use std::sync::Arc;
use async_trait::async_trait;
use meerkat_core::{ImageGenerationProviderProfile, Provider};
use crate::provider_runtime::binding::{ResolvedConnection, ValidatedBinding};
use crate::provider_runtime::errors::{ProviderAuthError, ProviderClientError};
use crate::provider_runtime::registry::ResolverEnvironment;
use crate::{ImageGenerationExecutor, LlmClient};
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
pub trait ProviderRuntime: Send + Sync {
fn provider_id(&self) -> Provider;
async fn resolve_binding(
&self,
binding: &ValidatedBinding,
env: &ResolverEnvironment,
) -> Result<ResolvedConnection, ProviderAuthError>;
fn build_client(
&self,
connection: ResolvedConnection,
) -> Result<Arc<dyn LlmClient>, ProviderClientError>;
fn build_image_generation_executor(
&self,
_connection: ResolvedConnection,
) -> Result<Option<Arc<dyn ImageGenerationExecutor>>, ProviderClientError> {
Ok(None)
}
fn image_generation_profile(&self) -> Option<Arc<dyn ImageGenerationProviderProfile>> {
None
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)]
mod tests {
use std::sync::Arc;
use super::*;
use crate::provider_runtime::binding::{NormalizedAuthMethod, NormalizedBackendKind};
use meerkat_core::{AuthMetadata, BindingPolicy, ResolvedAuthKind};
struct MockRuntime;
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
impl ProviderRuntime for MockRuntime {
fn provider_id(&self) -> Provider {
Provider::Other
}
async fn resolve_binding(
&self,
_binding: &ValidatedBinding,
_env: &ResolverEnvironment,
) -> Result<ResolvedConnection, ProviderAuthError> {
Err(ProviderAuthError::Auth(
meerkat_core::AuthError::InteractiveLoginRequired,
))
}
fn build_client(
&self,
_connection: ResolvedConnection,
) -> Result<Arc<dyn LlmClient>, ProviderClientError> {
Err(ProviderClientError::MissingFeature("mock"))
}
}
#[test]
fn mock_is_object_safe() {
let runtime: Arc<dyn ProviderRuntime> = Arc::new(MockRuntime);
assert_eq!(runtime.provider_id(), Provider::Other);
let _env = ResolverEnvironment::testing();
let _ = ResolvedAuthKind::None;
let _ = AuthMetadata::default();
let _ = BindingPolicy::default();
let _ = std::marker::PhantomData::<NormalizedBackendKind>;
let _ = std::marker::PhantomData::<NormalizedAuthMethod>;
}
}