Skip to main content

vika/api/
field.rs

1#[derive(Debug, Serialize, Deserialize)]
2pub struct Field {
3    pub id: String,
4    pub name: String,
5    pub r#type: FieldType,
6    pub desc: Option<String>,
7    pub property: Option<HashMap<String, serde_json::Value>>,
8}
9
10#[derive(Debug, Serialize, Deserialize)]
11pub struct FieldsRespSchema {
12    pub fields: Vec<Field>,
13}
14
15pub struct FieldsManager {
16    pub space_id: String,
17    pub datasheet_id: String,
18    pub view_id: Option<String>,
19    pub config: Config,
20}
21
22impl FieldsManager {
23    pub async fn query_all(&self) -> anyhow::Result<Vec<Field>, anyhow::Error> {
24        let url = format!(
25            "{}/datasheets/{}/fields{}",
26            self.config.get_url(),
27            self.datasheet_id,
28            match self.view_id.clone() {
29                Some(view_id) => format!("?viewId={}", view_id),
30                None => format!(""),
31            }
32        );
33        let client = reqwest::Client::new();
34        let resp = client
35            .get(&url)
36            .headers(self.config.clone().into())
37            .send()
38            .await?
39            .json::<ResponseSchema<FieldsRespSchema>>()
40            .await?;
41        match resp.code {
42            200 => anyhow::Ok(resp.data.unwrap().fields),
43            _ => Err(anyhow::Error::msg(format!(
44                "code: {}, success: {}, message: {}, request_url: {}",
45                resp.code, resp.success, resp.message, url
46            ))),
47        }
48    }
49}
50
51pub struct FieldManager {
52    pub space_id: String,
53    pub datasheet_id: String,
54    pub view_id: String,
55    pub field_id: String,
56    pub config: Config,
57}
58
59use std::collections::HashMap;
60
61use serde::{Deserialize, Serialize};
62
63use crate::common::{config::Config, http::ResponseSchema};
64
65#[derive(Debug, Serialize, Deserialize)]
66pub enum FieldType {
67    SingleText,
68    Text,
69    SingleSelect,
70    MultiSelect,
71    Number,
72    Currency,
73    Percent,
74    Datetime,
75    Attachment,
76    Member,
77    Checkbox,
78    Rating,
79    URL,
80    Phone,
81    Email,
82    WorkDoc,
83    OneWayLink,
84    TwoWayLink,
85    MagicLookUp,
86    Formula,
87    AutoNumber,
88    Button,
89    DateTime,
90}
91
92impl std::fmt::Display for FieldType {
93    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
94        write!(
95            f,
96            "{:?}",
97            match self {
98                FieldType::SingleText => "SingleText",
99                FieldType::Text => "Text",
100                FieldType::SingleSelect => "SingleSelect",
101                FieldType::MultiSelect => "MultiSelect",
102                FieldType::Number => "Number",
103                FieldType::Currency => "Currency",
104                FieldType::Percent => "Percent",
105                FieldType::Datetime => "Datetime",
106                FieldType::Attachment => "Attachment",
107                FieldType::Member => "Member",
108                FieldType::Checkbox => "Checkbox",
109                FieldType::Rating => "Rating",
110                FieldType::URL => "URL",
111                FieldType::Phone => "Phone",
112                FieldType::Email => "Email",
113                FieldType::WorkDoc => "WorkDoc",
114                FieldType::OneWayLink => "OneWayLink",
115                FieldType::TwoWayLink => "TwoWayLink",
116                FieldType::MagicLookUp => "MagicLookUp",
117                FieldType::Formula => "Formula",
118                FieldType::AutoNumber => "AutoNumber",
119                FieldType::Button => "Button",
120                FieldType::DateTime => "DateTime",
121            }
122        )
123    }
124}
125
126#[derive(Debug, Serialize, Deserialize)]
127pub struct Attachment {
128    id: String,
129    name: String,
130    size: usize,
131    mime_type: String,
132    token: String,
133    width: usize,
134    height: usize,
135    url: String,
136}
137#[derive(Debug, Serialize, Deserialize)]
138pub struct Member {
139    id: String,
140    r#type: i32,
141    name: String,
142    avatar: String,
143}
144#[derive(Debug, Serialize, Deserialize)]
145pub struct Url {
146    title: String,
147    text: String,
148    fafavicon: String,
149}
150#[derive(Debug, Serialize, Deserialize)]
151pub enum Formula {
152    Formula(String),
153    Number(f64),
154    Bool(bool),
155}
156#[derive(Debug, Serialize, Deserialize)]
157pub struct WorkDoc {
158    document_id: String,
159    title: String,
160}