Skip to main content

zai_rs/knowledge/
list.rs

1use super::types::KnowledgeListResponse;
2use crate::ZaiResult;
3use crate::client::ZaiClient;
4
5/// Query parameters for knowledge list API
6#[derive(Debug, Clone, Default, serde::Serialize, validator::Validate)]
7#[allow(clippy::new_without_default)]
8pub struct KnowledgeListQuery {
9    /// Page index starting from 1 (default 1)
10    #[serde(skip_serializing_if = "Option::is_none")]
11    #[validate(range(min = 1))]
12    pub page: Option<u32>,
13    /// Page size (default 10)
14    #[serde(skip_serializing_if = "Option::is_none")]
15    #[validate(range(min = 1))]
16    pub size: Option<u32>,
17}
18
19impl KnowledgeListQuery {
20    /// Create a new query (page 1, size 10).
21    #[allow(clippy::new_without_default)]
22    pub fn new() -> Self {
23        Self {
24            page: Some(1),
25            size: Some(10),
26        }
27    }
28    /// Set the page index (1-based).
29    pub fn with_page(mut self, page: u32) -> Self {
30        self.page = Some(page);
31        self
32    }
33    /// Set the page size.
34    pub fn with_size(mut self, size: u32) -> Self {
35        self.size = Some(size);
36        self
37    }
38
39    /// Build the `(&str, String)` query pairs (in stable order) used to form
40    /// the request URL.
41    fn pairs(&self) -> Vec<(&'static str, String)> {
42        let mut params: Vec<(&'static str, String)> = Vec::new();
43        if let Some(page) = self.page.as_ref() {
44            params.push(("page", page.to_string()));
45        }
46        if let Some(size) = self.size.as_ref() {
47            params.push(("size", size.to_string()));
48        }
49        params
50    }
51}
52
53/// Knowledge list request (GET /llm-application/open/knowledge)
54///
55/// Credentials and transport live on the [`ZaiClient`], passed to
56/// [`send_via`](Self::send_via).
57#[allow(clippy::new_without_default)]
58pub struct KnowledgeListRequest {
59    query: KnowledgeListQuery,
60}
61
62impl KnowledgeListRequest {
63    /// Create a new knowledge-list request (default query: page 1, size 10).
64    #[allow(clippy::new_without_default)]
65    pub fn new() -> Self {
66        Self {
67            query: KnowledgeListQuery::new(),
68        }
69    }
70
71    /// Apply a query (replaces the current one).
72    pub fn with_query(mut self, q: KnowledgeListQuery) -> Self {
73        self.query = q;
74        self
75    }
76
77    /// Send via a [`ZaiClient`] and parse the typed response.
78    pub async fn send_via(&self, client: &ZaiClient) -> ZaiResult<KnowledgeListResponse> {
79        let params = self.query.pairs();
80        let route = crate::client::routes::KNOWLEDGE_LIST;
81        let url = client.endpoints().resolve_route_with_query(
82            route,
83            &[],
84            &params
85                .iter()
86                .map(|(k, v)| (*k, v.as_str()))
87                .collect::<Vec<_>>(),
88        )?;
89        client
90            .send_empty::<KnowledgeListResponse>(route.method(), url)
91            .await
92    }
93
94    /// Validate the query then send via a [`ZaiClient`] and parse the typed
95    /// response.
96    pub async fn send_via_with_query(
97        mut self,
98        client: &ZaiClient,
99        q: &KnowledgeListQuery,
100    ) -> ZaiResult<KnowledgeListResponse> {
101        use validator::Validate;
102        q.validate()?;
103        self.query = q.clone();
104        self.send_via(client).await
105    }
106}