1use super::access::{Access, RoAccess};
2use super::filebrowser::FileBrowser;
3use crate::errors::{check, CubeError};
4use crate::search::*;
5use crate::types::{CubeUrl, FeedId, PipelineId, PluginId, PluginInstanceId};
6use crate::{FeedResponse, LinkedModel, PipelineResponse, PluginInstanceResponse, PluginResponse};
7use async_trait::async_trait;
8use reqwest_middleware::ClientWithMiddleware;
9use serde::de::DeserializeOwned;
10use std::fmt::Display;
11
12#[async_trait]
14pub trait BaseChrisClient<A: Access> {
15 fn filebrowser(&self) -> FileBrowser;
17
18 fn url(&self) -> &CubeUrl;
20
21 fn plugin(&self) -> PluginSearchBuilder<A>;
23
24 fn pipeline(&self) -> PipelineSearchBuilder<A>;
26
27 fn public_feeds(&self) -> FeedSearchBuilder<RoAccess>;
29
30 async fn get_feed(&self, id: FeedId) -> Result<LinkedModel<FeedResponse, A>, CubeError>;
38
39 async fn get_plugin_instance(
41 &self,
42 id: PluginInstanceId,
43 ) -> Result<LinkedModel<PluginInstanceResponse, A>, CubeError>;
44
45 async fn get_plugin(
47 &self,
48 id: PluginId,
49 ) -> Result<LinkedModel<PluginResponse, A>, GetOnlyError> {
50 self.plugin()
51 .id(id)
52 .search()
53 .page_limit(1)
54 .max_items(1)
55 .get_only()
56 .await
57 }
58
59 async fn get_pipeline(
61 &self,
62 id: PipelineId,
63 ) -> Result<LinkedModel<PipelineResponse, A>, GetOnlyError> {
64 self.pipeline()
65 .id(id)
66 .search()
67 .page_limit(1)
68 .max_items(1)
69 .get_only()
70 .await
71 }
72}
73
74pub(crate) async fn fetch_id<A: Access, T: DeserializeOwned>(
75 client: &ClientWithMiddleware,
76 url: impl Display,
77 id: u32,
78) -> Result<LinkedModel<T, A>, CubeError> {
79 let url = format!("{}{}/", url, id);
80 let res = client.get(url).send().await?;
81 let data = check(res).await?.json().await?;
82 Ok(LinkedModel {
83 client: client.clone(),
84 object: data,
85 phantom: Default::default(),
86 })
87}