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, serde_saphyr::ser::Error> {
6        serde_saphyr::to_string(&self.schema())
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
34leaf_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("leaf_kinds:") && yaml.contains("indorsement:"));
47        assert!(yaml.contains("ui:") && yaml.contains("group: Meta"));
48    }
49
50    #[test]
51    fn omits_leaf_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("leaf_kinds:"));
61    }
62
63    #[test]
64    fn omits_example_and_ref() {
65        let mut config = cfg(FULL);
66        config.example_markdown = Some("# x".to_string());
67        let yaml = config.schema_yaml().unwrap();
68        assert!(!yaml.contains("example:"));
69        assert!(!yaml.contains("ref:"));
70    }
71
72    #[test]
73    fn json_yaml_parity() {
74        let config = cfg(FULL);
75        let parse = |yaml: &str| serde_saphyr::from_str::<serde_json::Value>(yaml).unwrap();
76        assert_eq!(config.schema(), parse(&config.schema_yaml().unwrap()));
77    }
78}