rust_store_core/dialect/
translate.rs1use serde_json::{json, Value};
4
5use crate::schema::Registry;
6
7use super::select::translate_select;
8use super::write::translate_write;
9use super::Backend;
10
11pub fn translate(backend: Backend, cmd: &Value, registry: &Registry) -> Result<Value, String> {
25 let mut warnings: Vec<String> = Vec::new();
26 let mut unsupported: Vec<Value> = Vec::new();
27 let kind = cmd.get("kind").and_then(|v| v.as_str()).unwrap_or("");
28
29 let stmts = match kind {
30 "find" | "findOne" | "countDocuments" | "aggregate" => {
31 translate_select(backend, cmd, registry, &mut warnings, &mut unsupported)?
32 }
33 "insertOne" | "insertMany" | "deleteMany" | "updateMany" | "findOneAndUpdate"
34 | "claim" | "compareAndSet" => translate_write(backend, cmd, registry)?,
35 _ => return Err(format!("translate: 未支持的命令 kind = {}", kind)),
36 };
37
38 Ok(json!({
39 "backend": backend.as_str(),
40 "stmts": stmts.iter().map(|s| s.to_value()).collect::<Vec<_>>(),
41 "warnings": warnings,
42 "unsupported": unsupported,
43 }))
44}