Skip to main content

quillmark_core/quill/
schema_yaml.rs

1use super::QuillConfig;
2
3impl QuillConfig {
4    /// YAML encoding of [`QuillConfig::schema`].
5    pub fn schema_yaml(&self) -> Result<String, crate::error::YamlError> {
6        serde_saphyr::to_string(&self.schema()).map_err(crate::error::YamlError::from_ser)
7    }
8}
9
10#[cfg(test)]
11mod tests {
12    use crate::quill::QuillConfig;
13
14    fn cfg(yaml: &str) -> QuillConfig {
15        QuillConfig::from_yaml(yaml).expect("valid quill yaml")
16    }
17
18    const FULL: &str = r#"
19quill:
20  name: full
21  version: "1.0"
22  backend: typst
23  description: Full
24main:
25  fields:
26    status:
27      type: string
28      enum: [draft, final]
29      default: draft
30      ui:
31        group: Meta
32    page_count:
33      type: integer
34card_kinds:
35  indorsement:
36    fields:
37      signature_block:
38        type: string
39"#;
40
41    #[test]
42    fn schema_includes_ui() {
43        let config = cfg(FULL);
44        let yaml = config.schema_yaml().unwrap();
45        assert!(yaml.contains("enum:") && yaml.contains("type: integer"));
46        assert!(yaml.contains("card_kinds:") && yaml.contains("indorsement:"));
47        assert!(yaml.contains("ui:") && yaml.contains("group: Meta"));
48    }
49
50    #[test]
51    fn omits_card_kinds_when_absent() {
52        let yaml = cfg(r#"
53quill: { name: solo, version: "1.0", backend: typst, description: x }
54main:
55  fields:
56    title: { type: string }
57"#)
58        .schema_yaml()
59        .unwrap();
60        assert!(yaml.contains("main:") && !yaml.contains("card_kinds:"));
61    }
62
63    #[test]
64    fn omits_ref() {
65        let yaml = cfg(FULL).schema_yaml().unwrap();
66        assert!(!yaml.contains("ref:"));
67    }
68
69    #[test]
70    fn json_yaml_parity() {
71        let config = cfg(FULL);
72        let parse = |yaml: &str| serde_saphyr::from_str::<serde_json::Value>(yaml).unwrap();
73        assert_eq!(config.schema(), parse(&config.schema_yaml().unwrap()));
74    }
75}