use std::collections::BTreeSet;
use serde_json::{Map, Value};
use crate::components::HookBinding;
pub(crate) fn render_hook_group(hook: &HookBinding) -> Value {
let mut group = Map::new();
if let Some(matcher) = &hook.matcher {
group.insert("matcher".into(), Value::from(matcher.clone()));
}
let mut handler = Map::new();
handler.insert("type".into(), Value::from("command"));
handler.insert("command".into(), Value::from(hook.command.clone()));
group.insert("hooks".into(), Value::Array(vec![Value::Object(handler)]));
Value::Object(group)
}
pub(crate) fn remove_hook_groups(events: &mut Map<String, Value>, ours: &BTreeSet<&str>) {
events.retain(|_, groups| {
let Some(list) = groups.as_array_mut() else { return true };
if list.is_empty() {
return true;
}
list.retain_mut(|group| {
let Some(handlers) = group.get_mut("hooks").and_then(Value::as_array_mut) else { return true };
if handlers.is_empty() {
return true;
}
handlers.retain(|h| h.get("command").and_then(Value::as_str).is_none_or(|c| !ours.contains(c)));
!handlers.is_empty()
});
!list.is_empty()
});
}
pub(crate) fn hook_is_portable(hook: &HookBinding) -> bool {
hook.is_portable()
}