extern crate clap;
#[cfg(test)]
extern crate matches;
use clap::{Parser, Subcommand};
use colored::*;
mod config;
mod prompt;
mod request;
const NAME: &str = "GPTO";
const VERSION: &str = env!("CARGO_PKG_VERSION");
const AUTHOR: &str = "Alan Vardy <alan@vardy.cc>";
const ABOUT: &str = "A tiny unofficial OpenAI client";
#[derive(Parser, Clone)]
#[command(name = NAME)]
#[command(version = VERSION)]
#[command(about = ABOUT, long_about = None)]
#[command(author = AUTHOR, version)]
#[command(arg_required_else_help(true))]
struct Cli {
#[arg(short, long, default_value_t = false)]
disable_spinner: bool,
#[arg(short, long, default_value_t = String::new())]
suffix: String,
#[arg(short, long)]
model: Option<String>,
#[arg(short, long)]
config: Option<String>,
#[arg(short, long)]
endpoint: Option<String>,
#[arg(short, long, default_value_t = 1.0)]
temperature: f32,
#[arg(short, long, default_value_t = 1)]
number: u8,
#[arg(short = 'a', long, default_value_t = 1000)]
max_tokens: u32,
#[arg(short = 'i', long)]
timeout: Option<u64>,
#[arg(short = 'o', long, default_value_t = 1.0)]
top_p: f32,
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand, Debug, Clone)]
enum Commands {
Prompt {
#[arg(short, long)]
text: Option<String>,
#[arg(short, long, default_value_t = false)]
stdin: bool,
},
Conversation {
#[arg(short, long, default_value_t = String::new())]
instructions: String,
},
}
fn main() {
let cli = Cli::parse();
let result = match &cli.command {
Commands::Prompt { text, stdin } => prompt::completions(cli.clone(), text, stdin),
Commands::Conversation { instructions } => request::conversation(cli.clone(), instructions),
};
match result {
Ok(output) => {
println!("{output}");
std::process::exit(0);
}
Err(e) => {
println!("{}", e.red());
std::process::exit(1);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn cli_works() {
Cli::try_parse().err();
}
}