aev-audio 0.1.0

Minimal Aev completion ping plugin.
Documentation
use aev_audio::{ping, watch, WatchConfig, PLUGIN_INIT_JSON};
use std::env;
use std::path::PathBuf;
use std::process::ExitCode;

fn main() -> ExitCode {
    match run() {
        Ok(()) => ExitCode::SUCCESS,
        Err(error) => {
            eprintln!("aev-audio: {error}");
            ExitCode::FAILURE
        }
    }
}

fn run() -> Result<(), String> {
    let mut args = env::args().skip(1);
    let command = args.next().unwrap_or_else(|| "watch".to_string());
    match command.as_str() {
        "ping" => ping().map_err(|error| error.to_string()),
        "manifest" => {
            println!("{PLUGIN_INIT_JSON}");
            Ok(())
        }
        "watch" => {
            let mut workspace = env::current_dir().map_err(|error| error.to_string())?;
            let mut from_start = false;
            let mut once = false;
            while let Some(argument) = args.next() {
                match argument.as_str() {
                    "--workspace" | "-w" => {
                        workspace = PathBuf::from(
                            args.next()
                                .ok_or_else(|| "--workspace requires a path".to_string())?,
                        );
                    }
                    "--from-start" => from_start = true,
                    "--once" => once = true,
                    "--help" | "-h" => {
                        print_help();
                        return Ok(());
                    }
                    unknown => return Err(format!("unknown watch option `{unknown}`")),
                }
            }
            watch(&WatchConfig {
                workspace,
                from_start,
                once,
            })
            .map_err(|error| error.to_string())
        }
        "help" | "--help" | "-h" => {
            print_help();
            Ok(())
        }
        unknown => Err(format!("unknown command `{unknown}`; use `aev-audio help`")),
    }
}

fn print_help() {
    println!(
        "aev-audio - minimal Aev completion ping\n\nUSAGE:\n  aev-audio ping\n  aev-audio watch [--workspace PATH] [--from-start] [--once]\n  aev-audio manifest\n\n`watch` tails PATH/.aev/journal.jsonl and rings on new assistant_completed events."
    );
}