grimoire_css 1.9.0

A magical CSS engine for all environments
Documentation
use grimoire_css_lib::mcp::McpServer;
use serde_json::Value;
use std::io::{self, BufRead, Write};
use std::path::PathBuf;

fn main() {
    let mut args = std::env::args_os().skip(1);
    let root = match (args.next(), args.next(), args.next()) {
        (None, None, None) => std::env::current_dir(),
        (Some(flag), Some(root), None) if flag == "--root" => Ok(PathBuf::from(root)),
        _ => {
            eprintln!("usage: grimoire_css_mcp [--root PROJECT_ROOT]");
            std::process::exit(2);
        }
    };
    let server = match root {
        Ok(root) => McpServer::new(root),
        Err(error) => {
            eprintln!("cannot determine MCP project root: {error}");
            std::process::exit(1);
        }
    };

    let stdin = io::stdin();
    let mut stdout = io::stdout().lock();
    for line in stdin.lock().lines() {
        let response = match line {
            Ok(line) => match serde_json::from_str::<Value>(&line) {
                Ok(request) => server.dispatch(request),
                Err(_) => Some(serde_json::json!({
                    "jsonrpc":"2.0",
                    "id":null,
                    "error":{"code":-32700,"message":"Parse error"}
                })),
            },
            Err(_) => break,
        };
        if let Some(response) = response
            && (serde_json::to_writer(&mut stdout, &response).is_err()
                || stdout.write_all(b"\n").is_err()
                || stdout.flush().is_err())
        {
            break;
        }
    }
}