use serde_json::{json, Value};
use crate::schema::Registry;
use super::select::translate_select;
use super::write::translate_write;
use super::Backend;
pub fn translate(backend: Backend, cmd: &Value, registry: &Registry) -> Result<Value, String> {
let mut warnings: Vec<String> = Vec::new();
let mut unsupported: Vec<Value> = Vec::new();
let kind = cmd.get("kind").and_then(|v| v.as_str()).unwrap_or("");
let stmts = match kind {
"find" | "findOne" | "countDocuments" | "aggregate" => {
translate_select(backend, cmd, registry, &mut warnings, &mut unsupported)?
}
"insertOne" | "insertMany" | "deleteMany" | "updateMany" | "findOneAndUpdate" => {
translate_write(backend, cmd, registry)?
}
_ => return Err(format!("translate: 未支持的命令 kind = {}", kind)),
};
Ok(json!({
"backend": backend.as_str(),
"stmts": stmts.iter().map(|s| s.to_value()).collect::<Vec<_>>(),
"warnings": warnings,
"unsupported": unsupported,
}))
}