Skip to main content

moss_core/resolve/
ext_kind.rs

1//! Single source of truth mapping a file extension to its embed kind.
2//! Pure; shared by build + editor. Replaces the duplication flagged at
3//! `wikilink_dispatch.rs` (synth_kind_for_ext tables vs EmbedRenderer::extensions()).
4
5/// The render family a non-folder, non-link target belongs to, by extension.
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum ExtKind {
8    Image,
9    Iframe,
10    Pdf,
11    Video,
12    Audio,
13    Model,
14    Transclusion, // .md / .markdown
15    Notebook,     // .ipynb
16    Table,        // .csv / .tsv
17    Other,        // unknown extension → caller treats as a Link
18}
19
20/// Classify a lowercase extension (no leading dot). Unknown → `Other`.
21/// Derives from the asset registry SSOT so ext_kind and the registry never drift.
22pub fn reference_kind_for_ext(ext: &str) -> ExtKind {
23    crate::resolve::asset_registry::asset_info(ext)
24        .map(|a| a.kind)
25        .unwrap_or(ExtKind::Other)
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn classifies_each_family() {
34        assert_eq!(reference_kind_for_ext("png"), ExtKind::Image);
35        assert_eq!(reference_kind_for_ext("html"), ExtKind::Iframe);
36        assert_eq!(reference_kind_for_ext("pdf"), ExtKind::Pdf);
37        assert_eq!(reference_kind_for_ext("mp4"), ExtKind::Video);
38        assert_eq!(reference_kind_for_ext("mp3"), ExtKind::Audio);
39        assert_eq!(reference_kind_for_ext("glb"), ExtKind::Model);
40        assert_eq!(reference_kind_for_ext("md"), ExtKind::Transclusion);
41        assert_eq!(reference_kind_for_ext("ipynb"), ExtKind::Notebook);
42        assert_eq!(reference_kind_for_ext("csv"), ExtKind::Table);
43        assert_eq!(reference_kind_for_ext("xyz"), ExtKind::Other);
44    }
45
46    #[test]
47    fn kind_matches_registry_for_all_known_exts() {
48        use crate::resolve::asset_registry::all_assets;
49        for a in all_assets() {
50            assert_eq!(reference_kind_for_ext(a.ext), a.kind, "kind mismatch for {}", a.ext);
51        }
52        assert_eq!(reference_kind_for_ext("avif"), ExtKind::Image); // was Other before
53    }
54}