use cosmic_text::{Align, Attrs, CacheKeyFlags, Color, Family, Metrics, Stretch, Style, Weight}; use jotdown::{ListKind, OrderedListNumbering, OrderedListStyle}; use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "Option")] pub enum ListKindOption { Some(#[serde(with = "ListKindSerde")] ListKind), None, } #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "jotdown::ListKind")] pub enum ListKindSerde { Unordered, Ordered { numbering: OrderedListNumbering, style: OrderedListStyle, start: u64, }, Task, } #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "jotdown::OrderedListNumbering")] pub enum OrderedListNumberingSerde { Decimal, AlphaLower, AlphaUpper, RomanLower, RomanUpper, } #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "jotdown::OrderedListStyle")] pub enum OrderedListStyleSerde { Period, Paren, ParenParen, } #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "Metrics")] pub struct MetricsSerde { pub font_size: f32, pub line_height: f32, } #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "Family")] pub enum FamilySerde<'a> { Name(&'a str), Serif, SansSerif, Cursive, Fantasy, Monospace, } #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "Stretch")] pub enum StretchSerde { UltraCondensed, ExtraCondensed, Condensed, SemiCondensed, Normal, SemiExpanded, Expanded, ExtraExpanded, UltraExpanded, } #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "Style")] pub enum StyleSerde { Normal, Italic, Oblique, } #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "Weight")] pub struct WeightSerde(pub u16); #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "Color")] pub struct ColorSerde(pub u32); #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "Option")] pub enum ColorOpt { Some(#[serde(with = "ColorSerde")] Color), None, } mod cache_key_flags { use cosmic_text::CacheKeyFlags; use serde::{Deserialize, Deserializer, Serialize, Serializer}; pub fn serialize(_: &CacheKeyFlags, serializer: S) -> Result where S: Serializer, { ().serialize(serializer) } pub fn deserialize<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { let _: () = <()>::deserialize(deserializer)?; Ok(CacheKeyFlags::empty()) } } #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "Attrs")] pub struct AttrsSerde<'a> { #[serde(with = "ColorOpt")] pub color_opt: Option, #[serde(with = "FamilySerde")] #[serde(borrow)] pub family: Family<'a>, #[serde(with = "StretchSerde")] pub stretch: Stretch, #[serde(with = "StyleSerde")] pub style: Style, #[serde(with = "WeightSerde")] pub weight: Weight, pub metadata: usize, #[serde(with = "cache_key_flags")] pub cache_key_flags: CacheKeyFlags, } #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "Option")] pub enum AlignSerde { Some(#[serde(with = "AlignRef")] Align), None, } #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(remote = "Align")] pub enum AlignRef { Left, Right, Center, Justified, End, }