use std::sync::Arc;
use crate::{
pipeline::extract_output::OutputConfig,
runtime::svg::{apply_svg_layout, reset_svg_layout},
storage::asset::svg::Svg,
};
#[derive(Debug, Default)]
pub(crate) struct SvgLayout {
parsed: Option<Arc<str>>,
generation: u64,
}
impl SvgLayout {
pub(crate) fn update(&mut self, svg: Option<&Svg>, output_config: &mut OutputConfig) -> bool {
let contents = svg.map(Svg::contents);
let current = match (&self.parsed, contents) {
(Some(parsed), Some(contents)) => Arc::ptr_eq(parsed, contents) || parsed == contents,
(None, None) => true,
_ => false,
};
if current {
return false;
}
self.parsed = contents.cloned();
self.generation += 1;
match contents {
Some(contents) => {
apply_svg_layout(contents, output_config);
}
None => reset_svg_layout(),
}
true
}
pub(crate) fn reset(&mut self) {
self.parsed = None;
self.generation += 1;
reset_svg_layout();
}
pub(crate) fn generation(&self) -> u64 {
self.generation
}
}