sable-bases/src/document.rs@main
raw
1use std::collections::HashMap;
2
3#[derive(Debug, serde::Deserialize)]
4pub struct Base {
5 pub forumlas: Option<HashMap<String, String>>,
6 pub properties: Option<HashMap<String, Property>>,
7 pub filters: Option<Filter>,
8 pub views: Vec<View>,
9}
10
11#[derive(Debug, serde::Deserialize)]
12#[serde(rename_all = "camelCase")]
13pub struct Property {
14 pub display_name: Option<String>,
15}
16
17#[derive(Debug, serde::Deserialize)]
18#[serde(untagged)]
19pub enum Filter {
20 And(AndFilter),
21 Not(NotFilter),
22 Or(OrFilter),
23 Expr(String),
24}
25
26#[derive(Debug, serde::Deserialize)]
27pub struct AndFilter {
28 pub and: Vec<Filter>,
29}
30
31#[derive(Debug, serde::Deserialize)]
32pub struct NotFilter {
33 pub not: Vec<Filter>,
34}
35
36#[derive(Debug, serde::Deserialize)]
37pub struct OrFilter {
38 pub or: Vec<Filter>,
39}
40
41#[derive(Debug, serde::Deserialize)]
42#[serde(rename_all = "camelCase")]
43pub enum ViewType {
44 Table,
45 Cards,
46}
47
48#[derive(Debug, serde::Deserialize)]
49#[serde(rename_all = "camelCase")]
50pub struct View {
51 #[serde(rename = "type")]
52 pub typ: ViewType,
53 pub name: String,
54 pub filters: Option<Filter>,
55 pub order: Option<Vec<String>>,
56 pub limit: Option<usize>,
57 pub card_size: Option<usize>,
58}
59
60#[cfg(test)]
61mod test {
62 use super::*;
63
64 #[test]
65 #[ignore]
66 fn test() {
67 static BASE: &str = r#"properties:
68 note.title:
69 displayName: Title
70 note.author:
71 displayName: Author
72 note.url:
73 displayName: URL
74 note.description:
75 displayName: Description
76views:
77 - type: cards
78 name: Cards
79 filters:
80 and:
81 - note["link-data"] == "fanfiction"
82 - favorite == true
83 - not:
84 - favorite == false
85 order:
86 - title
87 - author
88 - url
89 - description
90 limit: 10
91 cardSize: 800
92"#;
93
94 panic!("{:#?}", serde_yaml::from_str::<Base>(BASE));
95 }
96}
97