open_ai_rust 0.2.16

Open AI SDK for Rust. To my knowledge, the only fully comprehensive and up-to-date Open AI crate built in and for Rust. Provides both low-level control with high level ergonomics for doing cool things (the whole reason we use Rust in the first place). Is maintained and has been used and tested in products used in production.
Documentation
use serde_json::Value;
use crate::logoi::input::tool::FunctionParameter;
use super::parse_param::insert_param;

pub fn insert_obj_into_param_map(
    param_map: &mut serde_json::Map<String, serde_json::Value>,
    obj: &Vec<FunctionParameter>
) -> Result<(), String> {
    let obj = parse_obj(obj)?;
    for (key, value) in obj {
        param_map.insert(key, value);
    }
    Ok(())
}

pub fn parse_obj(
    obj: &Vec<FunctionParameter>
) -> Result<serde_json::Map<String, Value>, String> {
    let (fields_map, required_params) = match parse_fields(obj) {
        Ok((fields_map, required_params)) => (fields_map, required_params),
        Err(e) => return Err(e)
    };

    let mut obj: serde_json::Map<String, Value> = serde_json::Map::new();
    obj.insert("type".to_string(), serde_json::Value::String("object".to_string()));
    obj.insert("properties".to_string(), serde_json::Value::Object(fields_map));

    // if !required_params.is_empty() {
        obj.insert("required".to_string(), serde_json::Value::Array(required_params.into_iter().map(serde_json::Value::String).collect()));
    // }

    return Ok(obj)
}

fn parse_fields(fields: &Vec<FunctionParameter>) -> Result<(serde_json::Map<String, Value>, Vec<String>), String> {
    let mut fields_map = serde_json::Map::new();
    let mut required_params = Vec::new();
    for param in fields {
        match insert_param(&mut fields_map, &mut required_params, param) {
            Ok(_) => (),
            Err(e) => return Err(e)
        };
    }

    Ok((fields_map, required_params))
}