use serde_json::{Map, Value};
use crate::canonical::{CanonicalError, CanonicalRequest};
use crate::protocol::google_genai::encode::body_map;
use crate::protocol::json::finish_body;
use crate::protocol::{ProviderCtx, WireRequest};
pub(super) fn request_path(stream: bool) -> &'static str {
if stream {
"/v1internal:streamGenerateContent?alt=sse"
} else {
"/v1internal:generateContent"
}
}
pub(super) fn encode(
req: &CanonicalRequest,
ctx: &ProviderCtx,
) -> Result<WireRequest, CanonicalError> {
let url = format!(
"{}{}",
ctx.base_url,
request_path(req.stream.unwrap_or(false))
);
let mut envelope = Map::new();
envelope.insert("model".into(), Value::String(ctx.model.to_owned()));
envelope.insert("request".into(), Value::Object(body_map(req)?));
Ok(finish_body(envelope, url))
}
pub(super) fn unwrap(v: Value) -> Value {
match v {
Value::Object(mut map) if map.get("response").is_some_and(Value::is_object) => {
map.remove("response").unwrap_or(Value::Null)
}
other => other,
}
}