use shep_core::paths::ShepPaths;
use super::address::{self, ConfigPath};
use super::{Address, CopyRefusal};
use crate::commands::settings_write;
pub(super) fn refusal(
paths: &ShepPaths,
from: &Address,
target: &str,
except: &[Vec<String>],
source: &serde_json::Value,
) -> Option<CopyRefusal> {
let ConfigPath::Dog { dog, keys } = &from.path else {
return None;
};
let (_, standard) = settings_write::dog_standard(dog, paths)?;
let copied = match (keys.is_empty(), address::dog_table(source, dog)) {
(true, Some(serde_json::Value::Object(table))) => serde_json::Value::Object(
table
.iter()
.filter(|(key, _)| {
!except
.iter()
.any(|path| path.as_slice() == [(*key).clone()])
})
.map(|(key, value)| (key.clone(), value.clone()))
.collect(),
),
_ => serde_json::Value::Null,
};
settings_write::dog_wide::dog_wide_refusal(&standard, target, dog, keys, &copied)
.map(|refusal| CopyRefusal::Refused(refusal.to_string()))
}