use std::{fmt::Write, iter::FromIterator};
use super::SingleThreadServer;
use crate::family::Family;
#[derive(Default)]
pub struct Builder<'a> {
families: Vec<&'a str>,
}
impl<'a, 'iter> FromIterator<&'iter Family<'a>> for Builder<'a> {
fn from_iter<T: IntoIterator<Item = &'iter Family<'a>>>(iter: T) -> Self {
let mut builder = Self::default();
iter.into_iter().for_each(|f| {
builder.add_family(f);
});
builder
}
}
impl<'a> Builder<'a> {
pub fn add_family(&mut self, family: &Family<'a>) -> &mut Self {
self.families.push(family.name);
self
}
fn build_html(self, c: char) -> String {
let font_previews =
self.families
.into_iter()
.fold(String::new(), |mut acc: String, family| {
write!(
&mut acc,
include_str!("statics/preview_block_template.html"),
char = c,
family = family,
)
.expect("write to string should always success");
acc
});
format!(
include_str!("statics/template.html"),
style = include_str!("statics/style.css"),
script = include_str!("statics/script.js"),
font_previews = font_previews,
)
}
pub fn build_for(self, c: char) -> SingleThreadServer {
SingleThreadServer::new(self.build_html(c))
}
}