use zenith_core::{AssetDecl, AssetKind, Diagnostic, Document, Node};
use super::{find_node_any_mut, node_kind_str, record_affected};
pub(super) fn apply_add_asset(
id: &str,
kind: &str,
src: &str,
sha256: Option<&str>,
doc: &mut Document,
diagnostics: &mut Vec<Diagnostic>,
affected: &mut Vec<String>,
) {
if doc.assets.assets.iter().any(|a| a.id == id) {
diagnostics.push(Diagnostic::error(
"tx.duplicate_id",
format!("add_asset: an asset with id {:?} already exists", id),
None,
Some(id.to_owned()),
));
return;
}
doc.assets.assets.push(AssetDecl {
id: id.to_owned(),
kind: AssetKind::from_kind_str(kind),
src: src.to_owned(),
sha256: sha256.map(str::to_owned),
ai_prompt: None,
ai_model: None,
ai_provider: None,
ai_seed: None,
ai_generation_date: None,
ai_license: None,
ai_source_rights: None,
ai_safety_status: None,
ai_reuse_policy: None,
source_span: None,
unknown_props: Default::default(),
});
record_affected(id, affected);
}
pub(super) fn apply_set_asset(
node_id: &str,
asset_id: &str,
doc: &mut Document,
diagnostics: &mut Vec<Diagnostic>,
affected: &mut Vec<String>,
) {
let is_font = doc
.assets
.assets
.iter()
.find(|a| a.id == asset_id)
.is_some_and(|a| matches!(a.kind, AssetKind::Font));
if is_font {
diagnostics.push(Diagnostic::error(
"tx.invalid_value",
format!(
"set_asset: asset {:?} has kind font; image nodes require kind image or svg",
asset_id
),
None,
Some(node_id.to_owned()),
));
return;
}
match find_node_any_mut(doc, node_id) {
None => {
diagnostics.push(Diagnostic::error(
"tx.unknown_node",
format!("node {:?} not found in document", node_id),
None,
Some(node_id.to_owned()),
));
}
Some(Node::Image(img)) => {
img.asset = asset_id.to_owned();
record_affected(node_id, affected);
}
Some(other) => {
let kind = node_kind_str(other);
diagnostics.push(Diagnostic::error(
"tx.wrong_node_type",
format!(
"set_asset requires an image node but {:?} is a {}",
node_id, kind
),
None,
Some(node_id.to_owned()),
));
}
}
}