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