use std::env;
use clap::Parser;
use tokio::fs::OpenOptions;
use tokio::io::AsyncWriteExt;
use crate::cli::Cli;
mod cli;
mod git;
mod gemini;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let cli = Cli::parse();
if let Some(api) = cli.with_api {
OpenOptions::new()
.write(true)
.read(true)
.create(true)
.open(format!("{}/.env", env::current_exe().unwrap().parent().unwrap().display())).await?
.write_all(format!("GEMINI_API_KEY={}", api).as_bytes()).await?;
}
if !git::is_git_repo().await {
eprintln!("โ This is not a git repository.");
std::process::exit(1);
}
let diff_or_files = if git::has_commits().await {
git::get_git_diff().await?
} else {
git::get_untracked_files().await?
};
if diff_or_files.trim().is_empty() {
println!("โ
No changes to commit.");
return Ok(());
}
let prompt = gemini::build_prompt(&diff_or_files, &cli.lang);
let commit_msg = gemini::get_commit_message(&prompt).await?;
println!("๐ฌ Commit message:\n{}", commit_msg);
if cli.dry_run {
println!("๐งช Dry run enabled, exiting.");
return Ok(());
}
git::stage_all().await?;
git::commit(&commit_msg).await?;
if !cli.no_push {
git::push().await?;
}
Ok(())
}