use super::Whole;
use crate::driver::{Model, Transport};
use crate::error::ProviderError;
use crate::model::ModelList;
use crate::wire::{Call, Free, Operation, Wire};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ModelListing;
#[derive(Debug, Clone)]
pub struct ModelPage {
pub models: ModelList,
pub next: Option<String>,
}
impl Operation for ModelListing {
type Request = Option<String>;
type Event = std::convert::Infallible;
type End = ModelPage;
type Response = ModelPage;
type Fold = Whole<Self>;
type Emit = Free;
fn fold(_request: &Self::Request, _call: &mut Call<'_>) -> Self::Fold {
Whole::new()
}
}
impl<W, T> Model<W, T>
where
W: Wire<Op = ModelListing>,
T: Transport<W>,
{
pub async fn list(&self) -> Result<ModelList, ProviderError> {
let provider = self.name();
let pages = crate::driver::follow_cursors(provider, "model_listing", |cursor| async move {
let page = self.call_routed(cursor).await.map_err(|(error, path)| {
crate::model::listing::with_route(error, provider, &path)
})?;
Ok((page.models, page.next))
})
.await?;
Ok(ModelList::new(pages.into_iter().flatten().collect()))
}
}