use crate::vision::{VisionRequest, VisionResponse};
#[allow(unused_imports)]
use crate::AppState;
#[allow(unused_imports)]
use std::future::Future;
#[allow(unused_imports)]
use std::pin::Pin;
pub trait VisionProvider: Send + Sync {
#[allow(clippy::type_complexity)]
fn process_vision_request<'a>(
&'a self,
req: VisionRequest,
model_name: String,
state: &'a crate::AppState,
) -> std::pin::Pin<
Box<
dyn std::future::Future<Output = Result<VisionResponse, Box<dyn std::error::Error>>>
+ Send
+ 'a,
>,
>;
}
#[cfg(feature = "vision")]
pub struct PrivateVisionProvider;
#[cfg(feature = "vision")]
impl VisionProvider for PrivateVisionProvider {
fn process_vision_request<'a>(
&'a self,
req: VisionRequest,
model_name: String,
state: &'a crate::AppState,
) -> std::pin::Pin<
Box<
dyn std::future::Future<Output = Result<VisionResponse, Box<dyn std::error::Error>>>
+ Send
+ 'a,
>,
> {
Box::pin(async move {
let license_manager = crate::vision_license::VisionLicenseManager::new();
crate::vision::process_vision_request(req, &model_name, &license_manager, state).await
})
}
}
#[cfg(not(feature = "vision"))]
pub struct StubVisionProvider;
#[cfg(not(feature = "vision"))]
impl VisionProvider for StubVisionProvider {
fn process_vision_request<'a>(
&'a self,
#[allow(unused_variables)] _req: VisionRequest,
#[allow(unused_variables)] _model_name: String,
#[allow(unused_variables)] _state: &'a crate::AppState,
) -> std::pin::Pin<
Box<
dyn std::future::Future<Output = Result<VisionResponse, Box<dyn std::error::Error>>>
+ Send
+ 'a,
>,
> {
Box::pin(
async move { Err("Vision feature not enabled. This is a licensed feature.".into()) },
)
}
}