use core::fmt;
use std::ops::DerefMut;
use std::sync::{Arc, Mutex};
use super::*;
#[derive(Debug)]
pub struct StaticReader {
inner: Arc<Mutex<StyleData>>,
}
impl StaticReader {
pub fn read_style_data(self) -> StyleData {
self.inner
.lock()
.map(|m| m.clone())
.unwrap_or_else(|_| StyleData::new())
}
}
#[derive(Debug)]
pub struct StaticWriter {
inner: Arc<Mutex<StyleData>>,
}
pub fn render_static() -> (StaticWriter, StaticReader) {
let inner = Arc::new(Mutex::new(StyleData::new()));
(
StaticWriter {
inner: inner.clone(),
},
StaticReader { inner },
)
}
impl StyleData {
pub fn write_static_markup<W>(&self, w: &mut W) -> fmt::Result
where
W: fmt::Write,
{
for StyleDataContent { id, style_str, .. } in self.0.iter() {
write!(w, r#"<style data-style="{}">"#, id)?;
write!(w, "{}", html_escape::encode_style(&style_str))?;
write!(w, "</style>")?;
}
Ok(())
}
}
impl StyleManagerBuilder {
pub fn writer(mut self, w: StaticWriter) -> Self {
self.style_data = Some(w.inner);
self
}
}
impl StyleData {
pub(crate) fn new() -> StyleData {
StyleData(Arc::default())
}
}
impl StyleManager {
pub(crate) fn style_data(&self) -> Option<impl DerefMut<Target = StyleData> + '_> {
self.inner
.style_data
.as_ref()
.map(|m| m.lock().expect("failed to lock style data"))
}
}
impl StyleData {
pub(super) fn as_vec_mut(&mut self) -> &mut Vec<StyleDataContent> {
Arc::make_mut(&mut self.0)
}
}