rig_core/operation/
listing.rs1use super::Whole;
13use crate::driver::{Model, Transport};
14use crate::error::ProviderError;
15use crate::model::ModelList;
16use crate::wire::{Call, Free, Operation, Wire};
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq)]
20pub struct ModelListing;
21
22#[derive(Debug, Clone)]
24pub struct ModelPage {
25 pub models: ModelList,
27 pub next: Option<String>,
29}
30
31impl Operation for ModelListing {
32 type Request = Option<String>;
34 type Event = std::convert::Infallible;
35 type End = ModelPage;
36 type Response = ModelPage;
37 type Fold = Whole<Self>;
38 type Emit = Free;
39
40 fn fold(_request: &Self::Request, _call: &mut Call<'_>) -> Self::Fold {
41 Whole::new()
42 }
43}
44
45impl<W, T> Model<W, T>
46where
47 W: Wire<Op = ModelListing>,
48 T: Transport<W>,
49{
50 pub async fn list(&self) -> Result<ModelList, ProviderError> {
56 let provider = self.name();
57 let pages = crate::driver::follow_cursors(provider, "model_listing", |cursor| async move {
58 let page = self.call_routed(cursor).await.map_err(|(error, path)| {
59 crate::model::listing::with_route(error, provider, &path)
60 })?;
61 Ok((page.models, page.next))
62 })
63 .await?;
64 Ok(ModelList::new(pages.into_iter().flatten().collect()))
65 }
66}