Skip to main content

garbage_code_hunter/badge/
mod.rs

1//! Badge generation module.
2//!
3//! Generates SVG score badges for embedding in README files.
4
5pub mod generator;
6
7use anyhow::Result;
8use generator::{generate_svg, BadgeStyle};
9use std::fs;
10use std::path::Path;
11
12/// Run badge generation with a pre-computed score.
13pub fn run(score: f64, output_path: &Path, style: &BadgeStyle) -> Result<String> {
14    let svg = generate_svg(score, style);
15    fs::write(output_path, &svg)?;
16    Ok(format!(
17        "Badge written to {} (score: {:.0}/100)",
18        output_path.display(),
19        score
20    ))
21}
22
23/// Generate SVG string without writing to file.
24pub fn render(score: f64, style: &BadgeStyle) -> String {
25    generate_svg(score, style)
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31    use tempfile::TempDir;
32
33    #[test]
34    fn test_run_writes_file() {
35        let dir = TempDir::new().unwrap();
36        let path = dir.path().join("badge.svg");
37        let result = run(85.0, &path, &BadgeStyle::Flat);
38        assert!(result.is_ok());
39        assert!(path.exists());
40        let content = fs::read_to_string(&path).unwrap();
41        assert!(content.contains("<svg"));
42        assert!(content.contains("85"));
43    }
44
45    #[test]
46    fn test_render_returns_svg() {
47        let svg = render(72.0, &BadgeStyle::Flat);
48        assert!(svg.starts_with("<svg"));
49        assert!(svg.ends_with("</svg>"));
50    }
51
52    #[test]
53    fn test_render_plastic_style() {
54        let svg = render(90.0, &BadgeStyle::Plastic);
55        assert!(svg.contains("90"));
56    }
57}