mod json;
mod op;
mod remove;
mod toml;
use serde_json::Value;
use json::parse_json;
pub use op::{EntryMatch, MergeOp};
pub(crate) use remove::render_unmerge;
pub(crate) use toml::parse_toml;
use crate::Result;
fn is_toml(file: &str) -> bool {
file.ends_with(".toml")
}
pub(crate) fn render_merge(
file: &str,
existing: Option<&str>,
ops: &[MergeOp],
) -> Result<Option<String>> {
if is_toml(file) {
toml::render_toml_merge(existing, ops, file)
} else {
json::render_merge(existing, ops, file)
}
}
pub(crate) fn observe_entries(file: &str, text: &str, ops: &[MergeOp]) -> Result<Vec<Value>> {
if is_toml(file) {
let doc = parse_toml(file, text)?;
let mut out = Vec::new();
for op in ops {
if let Some(v) = toml::extract_toml(&doc, op)? {
out.push(v);
}
}
Ok(out)
} else {
let doc = parse_json(file, text)?;
Ok(ops
.iter()
.filter_map(|op| json::extract(&doc, op))
.collect())
}
}