genome-sh 0.1.0

The jq of genomics. Fast, local, human-readable variant analysis.
mod annotate;
mod compare;
mod config;
mod db;
mod extract;
mod predict;
mod query;
mod serve;

use anyhow::Result;
use clap::{Parser, Subcommand};

#[derive(Parser)]
#[command(
    name = "genome",
    about = "The jq of genomics. Fast, local, human-readable variant analysis.",
    version,
    after_help = "Run `genome <command> --help` for more information on a specific command."
)]
pub struct Cli {
    #[command(subcommand)]
    command: Command,
}

#[derive(Subcommand)]
enum Command {
    /// Look up a variant by rsID, coordinates, HGVS, or gene name.
    Query(query::QueryArgs),

    /// Annotate a VCF file against the local variant database.
    Annotate(annotate::AnnotateArgs),

    /// Extract variants from a CRAM or BAM file.
    Extract(extract::ExtractArgs),

    /// Compare variants between two individuals.
    Compare(compare::CompareArgs),

    /// Predict variant effects using AlphaGenome.
    Predict(predict::PredictArgs),

    /// Manage the local variant database.
    Db(db::DbArgs),

    /// Start the API server.
    Serve(serve::ServeArgs),

    /// View or set configuration.
    Config(config::ConfigArgs),
}

impl Cli {
    pub async fn run(self) -> Result<()> {
        match self.command {
            Command::Query(args) => args.run().await,
            Command::Annotate(args) => args.run().await,
            Command::Extract(args) => args.run().await,
            Command::Compare(args) => args.run().await,
            Command::Predict(args) => args.run().await,
            Command::Db(args) => args.run().await,
            Command::Serve(args) => args.run().await,
            Command::Config(args) => args.run(),
        }
    }
}