use crate::{Connection, CypherResult, Result};
pub struct CypherQuery<'a> {
conn: &'a Connection,
query: &'a str,
params: serde_json::Map<String, serde_json::Value>,
}
impl<'a> CypherQuery<'a> {
pub(crate) fn new(conn: &'a Connection, query: &'a str) -> Self {
CypherQuery {
conn,
query,
params: serde_json::Map::new(),
}
}
pub fn param(mut self, key: &str, value: impl Into<serde_json::Value>) -> Self {
self.params.insert(key.to_string(), value.into());
self
}
pub fn params(mut self, params: &serde_json::Value) -> Self {
if let serde_json::Value::Object(map) = params {
for (k, v) in map {
self.params.insert(k.clone(), v.clone());
}
}
self
}
pub fn run(self) -> Result<CypherResult> {
if self.params.is_empty() {
self.conn.cypher(self.query)
} else {
let params_value = serde_json::Value::Object(self.params);
self.conn
.execute_cypher_with_params(self.query, ¶ms_value)
}
}
}