async_dashscope/operation/file/
param.rs

1use serde::{Deserialize, Serialize};
2
3/// 文件上传参数
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct FileUploadParam {
6    /// 文件路径列表
7    pub files: Vec<String>,
8    /// 用途
9    pub purpose: String,
10    /// 描述列表
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub descriptions: Option<Vec<String>>,
13}
14
15impl FileUploadParam {
16    pub fn builder() -> FileUploadParamBuilder {
17        FileUploadParamBuilder::default()
18    }
19}
20
21#[derive(Default)]
22pub struct FileUploadParamBuilder {
23    files: Option<Vec<String>>,
24    purpose: Option<String>,
25    descriptions: Option<Vec<String>>,
26}
27
28impl FileUploadParamBuilder {
29    pub fn files<T: Into<String>>(mut self, files: Vec<T>) -> Self {
30        self.files = Some(files.into_iter().map(|f| f.into()).collect());
31        self
32    }
33
34    pub fn purpose<T: Into<String>>(mut self, purpose: T) -> Self {
35        self.purpose = Some(purpose.into());
36        self
37    }
38
39    pub fn descriptions<T: Into<String>>(mut self, descriptions: Vec<T>) -> Self {
40        self.descriptions = Some(descriptions.into_iter().map(|d| d.into()).collect());
41        self
42    }
43
44    pub fn build(self) -> Result<FileUploadParam, String> {
45        let files = self.files.unwrap_or_default();
46        if files.is_empty() {
47            return Err("Files cannot be empty".to_string());
48        }
49
50        let purpose = self.purpose.ok_or("Purpose is required")?;
51
52        Ok(FileUploadParam {
53            files,
54            purpose,
55            descriptions: self.descriptions,
56        })
57    }
58}