1use std::{env::args, process::exit};
2use checked_command::{CheckedCommand, Error};
3use http::{HeaderMap, HeaderValue, header::{AUTHORIZATION, CONTENT_TYPE}};
4use reqwest::Body;
5use serde::Deserialize;
6
7#[allow(dead_code)]
8#[derive(Deserialize)]
9struct Choice {
10 text: String,
11 index: i32,
12 logprobs: Option<String>,
13 finish_reason: String
14}
15
16#[allow(dead_code)]
17#[derive(Deserialize)]
18struct Usage {
19 prompt_tokens: i32,
20 completion_tokens: i32,
21 total_tokens: i32
22}
23
24#[allow(dead_code)]
25#[derive(Deserialize)]
26struct OpenAIResponse {
27 id: String,
28 object: String,
29 created: i32,
30 model: String,
31 choices: Vec<Choice>,
32 usage: Usage
33}
34
35#[derive(Debug, Clone)]
36pub struct CommandExecute {
37 program: String,
38 args: Vec<String>
39}
40
41pub struct CommandResult {
42 pub exit_code: i32,
43 pub error: String
44}
45
46pub fn get_command() -> CommandExecute {
47 let args = args().collect::<Vec<String>>();
48 if args.len() == 1 {
49 exit(1)
50 }
51 let mut args = args[1..].iter().map(|element| String::from(element)).collect::<Vec<String>>();
52 if args.len() != 0 {
53 args.remove(0);
54 }
55 let program = std::env::args().collect::<Vec<String>>()[1].clone();
56 CommandExecute {
57 program,
58 args
59 }
60}
61
62pub fn execute_command(command: CommandExecute) -> CommandResult {
63 let mut program = CheckedCommand::new(command.program.clone());
64 program.args(command.args);
65 let result = program.output();
66 match result {
67 Ok(output) => CommandResult {
68 exit_code: 0,
69 error: String::from_utf8_lossy(&*output.stdout).to_string()
70 },
71 Err(Error::Failure(ex, output)) => {
72 let mut error_message = String::new();
73 if let Some(out) = output {
74 error_message += &format!("{}",
75 String::from_utf8_lossy(&*out.stderr))[..];
76 CommandResult {
77 exit_code: ex.code().unwrap_or_default(),
78 error: error_message
79 }
80 } else {
81 CommandResult {
82 exit_code: ex.code().unwrap_or_default(),
83 error: String::from("Failure")
84 }
85 }
86 },
87 _ => panic!("How is this possible {:?}", result)
88 }
89}
90
91pub async fn openai_results_fetch(prompt: String) -> String {
92 let api_token = std::env::var("OPENAI_SK").expect("Open API Not found");
93 let url = String::from("https://api.openai.com/v1/completions");
94 let client = reqwest::Client::new();
95 let mut headers = HeaderMap::new();
96 headers.insert(CONTENT_TYPE, HeaderValue::from_str("application/json").unwrap());
97 headers.insert(AUTHORIZATION, HeaderValue::from_str(format!("Bearer {}", api_token).as_str()).unwrap());
98 let mut body = json::JsonValue::new_object();
99 body["model"] = "text-davinci-003".into();
100 body["prompt"] = prompt.into();
101 body["max_tokens"] = 1000.into();
102 let body_str = body.dump();
103 let res = client
104 .post(url)
105 .headers(headers)
106 .body(Into::<Body>::into(body_str.clone()))
107 .send()
108 .await
109 .expect("Response not received");
110 let res_json = res.json::<OpenAIResponse>().await.expect("Error deseralizing to json");
111 res_json.choices[0].text.clone()
112}