use uzor::fonts::FontFamily;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct FontSpec {
pub family: FontFamily,
pub size_px: f64,
pub bold: bool,
pub italic: bool,
}
impl FontSpec {
pub fn new(family: FontFamily, size_px: f64) -> Self {
Self { family, size_px, bold: false, italic: false }
}
pub fn bold(mut self) -> Self {
self.bold = true;
self
}
pub fn italic(mut self) -> Self {
self.italic = true;
self
}
pub fn to_css_font(&self) -> String {
let mut parts: Vec<String> = Vec::with_capacity(3);
if self.bold {
parts.push("bold".to_string());
}
if self.italic {
parts.push("italic".to_string());
}
parts.push(format!("{}px", self.size_px));
parts.push(self.family_name().to_string());
parts.join(" ")
}
fn family_name(&self) -> &'static str {
match self.family {
FontFamily::Roboto => "Roboto",
FontFamily::PtRootUi => "PT Root UI",
FontFamily::JetBrainsMono => "JetBrains Mono",
}
}
}
impl Default for FontSpec {
fn default() -> Self {
Self::new(FontFamily::Roboto, 16.0)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn to_css_font_orders_weight_style_size_family() {
let spec = FontSpec::new(FontFamily::JetBrainsMono, 14.0).bold().italic();
assert_eq!(spec.to_css_font(), "bold italic 14px JetBrains Mono");
}
#[test]
fn to_css_font_regular_has_no_weight_style_tokens() {
let spec = FontSpec::new(FontFamily::Roboto, 16.0);
assert_eq!(spec.to_css_font(), "16px Roboto");
}
#[test]
fn default_is_16px_regular_roboto() {
let spec = FontSpec::default();
assert_eq!(spec.family, FontFamily::Roboto);
assert_eq!(spec.size_px, 16.0);
assert!(!spec.bold);
assert!(!spec.italic);
}
}