openai-core 0.1.1

Rust SDK for OpenAI-compatible ecosystem
Documentation
use serde_json::{Map, Value};

pub(super) fn ensure_vec_len(values: &mut Vec<Value>, len: usize) {
    while values.len() < len {
        values.push(Value::Null);
    }
}

pub(super) fn ensure_object(value: &mut Value) -> &mut Map<String, Value> {
    if !value.is_object() {
        *value = Value::Object(Map::new());
    }
    value.as_object_mut().expect("value must be object")
}

pub(super) fn ensure_array_field<'a>(value: &'a mut Value, key: &str) -> &'a mut Vec<Value> {
    let object = ensure_object(value);
    let field = object
        .entry(key.to_owned())
        .or_insert_with(|| Value::Array(Vec::new()));
    if !field.is_array() {
        *field = Value::Array(Vec::new());
    }
    field.as_array_mut().expect("field must be array")
}

pub(super) fn ensure_object_field<'a>(
    value: &'a mut Value,
    key: &str,
) -> &'a mut Map<String, Value> {
    let object = ensure_object(value);
    let field = object
        .entry(key.to_owned())
        .or_insert_with(|| Value::Object(Map::new()));
    ensure_object(field)
}

pub(super) fn merge_object(target: &mut Map<String, Value>, delta: &Value) {
    let Some(delta_object) = delta.as_object() else {
        return;
    };
    for (key, value) in delta_object {
        if matches!(value, Value::Null) {
            continue;
        }
        target.insert(key.clone(), value.clone());
    }
}