wayver's git archive


an obsidian renderer
git clone https://git.wayver.dev/sable

sable-bases/src/document.rs@2b84405277e54ab809e328cf0237374d4b4dbd0c

raw
Date Commit Message Author Files + -
2026-02-23 01:55 initial mvp wayverd 139 17808 0
...

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