code_errors/
lib.rs

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}