mod client;
mod epub;
mod translate;
use crate::epub::Epub;
use crate::translate::translator::{Context, Translator};
use clap::{Parser, Subcommand};
use env_logger::Env;
use log::debug;
use std::path::PathBuf;
#[derive(Parser)]
#[command(version, about)]
struct Args {
#[clap(subcommand)]
subcommand: SubCommands,
}
#[derive(Subcommand)]
enum SubCommands {
OpenAi {
#[arg(short, long)]
input: PathBuf,
#[arg(short, long)]
output: PathBuf,
#[arg(short, long)]
language: String,
#[arg(short, long, default_value_t = String::from("gpt-4o-mini"))]
model: String,
#[arg(short, long, env, hide_env_values = true)]
api_key: String,
#[arg(long, default_value_t = 20)]
lines: usize,
#[arg(long, default_value_t = 5)]
requests: usize,
},
Gemini {
#[arg(short, long)]
input: PathBuf,
#[arg(short, long)]
output: PathBuf,
#[arg(short, long)]
language: String,
#[arg(short, long, default_value_t = String::from("gemini-2.0-flash-lite"))]
model: String,
#[arg(short, long, env, hide_env_values = true)]
api_key: String,
#[arg(long, default_value_t = 100)]
lines: usize,
#[arg(long, default_value_t = 1)]
requests: usize,
},
}
#[tokio::main]
async fn main() {
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
debug!("start");
let args = Args::parse();
match args.subcommand {
SubCommands::OpenAi {
api_key,
model,
language,
lines,
requests,
input,
output,
} => {
let translator = Translator::OpenAi(Context {
model,
api_key,
language,
lines,
requests,
});
let epub = Epub::new(input, output);
epub.translate(translator).await;
}
SubCommands::Gemini {
api_key,
model,
language,
lines,
requests,
input,
output,
} => {
let translator = Translator::Gemini(Context {
model,
api_key,
language,
lines,
requests,
});
let epub = Epub::new(input, output);
epub.translate(translator).await;
}
}
debug!("end");
}