git-ai 0.1.23

Git AI: Automates commit messages using ChatGPT. Stage your files, and Git AI generates the messages.
Documentation
mod uninstall;
mod install;
mod config;
mod examples;

use clap::{Arg, Command};
use anyhow::Result;
use dotenv::dotenv;

fn cli() -> Command {
  Command::new("git-ai")
    .about("A git extension that uses OpenAI to generate commit messages")
    .subcommand_required(true)
    .arg_required_else_help(true)
    .subcommand(
      Command::new("hook")
        .about("Installs the git-ai hook")
        .subcommand(Command::new("install").about("Installs the git-ai hook"))
        .subcommand(Command::new("uninstall").about("Uninstalls the git-ai hook"))
    )
    .subcommand(
      Command::new("config").about("Sets or gets configuration values").subcommand(
        Command::new("set")
          .about("Sets a configuration value")
          .subcommand(
            Command::new("model").about("Sets the model to use").arg(
              Arg::new("<VALUE>")
                .required(true)
                .index(1)
                .value_parser(clap::builder::NonEmptyStringValueParser::new())
            )
          )
          .subcommand(
            Command::new("language").about("Sets the language to use").arg(
              Arg::new("<VALUE>")
                .required(true)
                .index(1)
                .value_parser(clap::builder::NonEmptyStringValueParser::new())
            )
          )
          .subcommand(
            Command::new("max-diff-tokens")
              .about("Sets the maximum number of tokens to use for the diff")
              .arg(
                Arg::new("max-diff-tokens")
                  .required(true)
                  .index(1)
                  .value_parser(clap::value_parser!(usize))
              )
          )
          .subcommand(
            Command::new("max-length")
              .about("Sets the maximum length of the commit message")
              .arg(
                Arg::new("max-length")
                  .required(true)
                  .index(1)
                  .value_parser(clap::value_parser!(usize))
              )
          )
          .subcommand(
            Command::new("openai-api-key").about("Sets the OpenAI API key").arg(
              Arg::new("<VALUE>")
                .required(true)
                .index(1)
                .value_parser(clap::builder::NonEmptyStringValueParser::new())
            )
          )
      )
    )
    .subcommand(Command::new("examples").about("Runs examples of generated commit messages"))
}

#[tokio::main]
async fn main() -> Result<()> {
  env_logger::init();
  dotenv().ok();

  let args = cli().get_matches();

  match args.subcommand() {
    Some(("hook", sub)) => {
      match sub.subcommand() {
        Some(("install", _)) => {
          install::run()?;
        },
        Some(("uninstall", _)) => {
          uninstall::run()?;
        },
        _ => unreachable!()
      }
    },
    Some(("config", args)) => {
      match args.subcommand() {
        Some(("set", args)) => {
          config::run(args)?;
        },
        _ => unreachable!()
      }
    },
    Some(("examples", args)) => {
      examples::run(args).await?;
    },
    _ => unreachable!()
  }

  Ok(())
}