lowfat 0.1.0

CLI binary for lowfat
use crate::filters;
use anyhow::Result;
use lowfat_core::config::RunfConfig;
use lowfat_plugin::discovery::discover_plugins;

pub fn run() -> Result<()> {
    let config = RunfConfig::resolve();

    println!("Filters (lowfat):");
    if let Some(cfg_path) = lowfat_core::config::find_config_display() {
        println!("  config: {}", cfg_path.display());
    }
    println!("  level: {}", config.level);
    println!();

    // Native built-in filters
    let all_filters = filters::builtins();
    for (cmd, plugin) in &all_filters {
        let info = plugin.info();
        let enabled = config.is_enabled(cmd);
        let marker = if enabled { "[x]" } else { "[ ]" };
        println!("  {marker} {} (native) — {cmd}", info.name);
    }

    // External plugins
    let plugins = discover_plugins(&config.plugin_dir);
    for plugin in &plugins {
        let name = &plugin.manifest.plugin.name;
        let cmds = plugin.manifest.plugin.commands.join(", ");
        let enabled = plugin
            .manifest
            .plugin
            .commands
            .iter()
            .all(|c| config.is_enabled(c));
        let marker = if enabled { "[x]" } else { "[ ]" };
        let rt = format!("{:?}", plugin.manifest.runtime.runtime_type).to_lowercase();
        println!("  {marker} {name} ({rt}) — {cmds}");
    }

    if all_filters.is_empty() && plugins.is_empty() {
        println!("  (no filters found)");
    }

    Ok(())
}