use std::collections::HashSet;
use std::fs;
use std::path::Path;
use anyhow::{Context, Result};
fn main() -> Result<()> {
println!("Fetching blessed.rs rules...");
let blessed_rules =
cargo_bless::updater::update_rules().context("failed to fetch blessed.rs rules")?;
let data_path = Path::new("data/suggestions.json");
let existing: Vec<cargo_bless::suggestions::Rule> = if data_path.exists() {
let json = fs::read_to_string(data_path).context("failed to read data/suggestions.json")?;
serde_json::from_str(&json).context("failed to parse data/suggestions.json")?
} else {
Vec::new()
};
let hand_patterns: HashSet<String> = existing.iter().map(|r| r.pattern.clone()).collect();
let mut merged = existing;
let mut from_blessed = 0usize;
for rule in blessed_rules {
if !hand_patterns.contains(&rule.pattern) {
merged.push(rule);
from_blessed += 1;
}
}
println!(
"Merged: {} hand-authored + {} new from blessed.rs = {} total",
merged.len() - from_blessed,
from_blessed,
merged.len()
);
let json = serde_json::to_string_pretty(&merged).context("failed to serialize merged rules")?;
fs::write(data_path, format!("{json}\n")).context("failed to write data/suggestions.json")?;
println!("Wrote {}", data_path.display());
Ok(())
}