use alloc::string::String;
use serde_json::{Map, Value};
pub(super) fn set_pointer(root: &mut Map<String, Value>, pointer: &str, value: Value) -> bool {
let Some(path) = pointer.strip_prefix('/') else {
return false;
};
let mut segments = path.split('/').map(unescape_pointer);
let mut key = match segments.next() {
Some(key) => key,
None => return false,
};
let mut current = root;
for next in segments {
let entry = current
.entry(key)
.or_insert_with(|| Value::Object(Map::new()));
let Some(object) = entry.as_object_mut() else {
return false;
};
current = object;
key = next;
}
current.insert(key, value);
true
}
fn unescape_pointer(segment: &str) -> String {
segment.replace("~1", "/").replace("~0", "~")
}
pub(super) fn escape_pointer(segment: &str) -> String {
segment.replace('~', "~0").replace('/', "~1")
}