Skip to main content

cc_audit/engine/scanners/skill/
frontmatter.rs

1/// Parses YAML frontmatter from markdown files
2pub struct FrontmatterParser;
3
4impl FrontmatterParser {
5    /// Extract frontmatter content from a markdown file
6    ///
7    /// Frontmatter is delimited by `---` at the start and end.
8    /// Returns None if no valid frontmatter is found.
9    ///
10    /// # Example
11    /// ```ignore
12    /// let content = "---\nname: test\n---\n# Content";
13    /// let frontmatter = FrontmatterParser::extract(content);
14    /// assert_eq!(frontmatter, Some("name: test\n"));
15    /// ```
16    pub fn extract(content: &str) -> Option<&str> {
17        content.strip_prefix("---").and_then(|after_start| {
18            after_start
19                .find("---")
20                .map(|end_idx| &after_start[..end_idx])
21        })
22    }
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn test_valid_frontmatter() {
31        let content = "---\nname: test\ndescription: A test\n---\n# Content";
32        let result = FrontmatterParser::extract(content);
33        assert_eq!(result, Some("\nname: test\ndescription: A test\n"));
34    }
35
36    #[test]
37    fn test_frontmatter_with_allowed_tools() {
38        let content = "---\nname: skill\nallowed-tools: Read, Write\n---\n# Skill";
39        let result = FrontmatterParser::extract(content);
40        assert!(result.is_some());
41        assert!(result.unwrap().contains("allowed-tools"));
42    }
43
44    #[test]
45    fn test_no_frontmatter() {
46        let content = "# Just Markdown\nNo frontmatter here.";
47        assert!(FrontmatterParser::extract(content).is_none());
48    }
49
50    #[test]
51    fn test_incomplete_frontmatter() {
52        let content = "---\nname: test\nNo closing dashes";
53        assert!(FrontmatterParser::extract(content).is_none());
54    }
55
56    #[test]
57    fn test_empty_frontmatter() {
58        let content = "------\n# Content";
59        let result = FrontmatterParser::extract(content);
60        assert_eq!(result, Some(""));
61    }
62
63    #[test]
64    fn test_frontmatter_with_nested_dashes() {
65        let content = "---\nname: test\ndata: \"some---thing\"\n---\n# Content";
66        let result = FrontmatterParser::extract(content);
67        // Should extract up to the first closing ---
68        assert!(result.is_some());
69    }
70
71    #[test]
72    fn test_content_not_starting_with_dashes() {
73        let content = "# Title\n---\nname: test\n---";
74        assert!(FrontmatterParser::extract(content).is_none());
75    }
76}