use super::*;
pub(super) fn json_f32(val: &serde_json::Value, pointer: &str) -> f32 {
val.pointer(pointer)
.and_then(|v| v.as_f64())
.map(|f| f as f32)
.unwrap_or(0.0)
}
pub(super) fn json_str(val: &serde_json::Value, pointer: &str) -> String {
val.pointer(pointer)
.and_then(|v| v.as_str())
.unwrap_or("")
.to_string()
}
pub(super) fn json_bool(val: &serde_json::Value, pointer: &str) -> bool {
val.pointer(pointer)
.and_then(|v| v.as_bool())
.unwrap_or(false)
}
pub(super) fn json_string_array(val: &serde_json::Value, pointer: &str) -> Vec<String> {
val.pointer(pointer)
.and_then(|v| v.as_array())
.map(|arr| {
arr.iter()
.filter_map(|v| v.as_str().map(|s| s.to_string()))
.collect()
})
.unwrap_or_default()
}
pub(super) fn json_has_signal(val: &serde_json::Value, pointer: &str, signal: &str) -> bool {
val.pointer(pointer)
.and_then(|v| v.as_array())
.is_some_and(|arr| arr.iter().any(|v| v.as_str() == Some(signal)))
}
pub fn has_file_deleted_signal(file_record: &serde_json::Value) -> bool {
json_has_signal(file_record, "/staleness/signals", "file_deleted")
}
pub(super) fn any_qualifying_gotcha(
gotcha_keys: &[String],
gotcha_records: &HashMap<String, serde_json::Value>,
) -> bool {
gotcha_keys.iter().any(|gkey| {
gotcha_records
.get(gkey.as_str())
.filter(|grec| grec.is_object())
.is_some_and(|grec| {
json_bool(grec, "/payload/confirmed")
&& json_f32(grec, "/confidence/value") >= 0.6
&& json_f32(grec, "/quality/value") >= 0.4
})
})
}