quillmark_core/quill/
schema_yaml.rs1use super::QuillConfig;
2
3impl QuillConfig {
4 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}