sr-aef 0.1.1

Uncompile OpenType fonts back into Adobe feature file (fea) source code
Documentation
use fea_rs_ast::{AsFea, GlyphClass, Statement};
use indexmap::{IndexMap, IndexSet};
use serde::{Serializer, ser::SerializeMap};
use skrifa::Tag;
use smol_str::SmolStr;
use std::collections::HashMap;

pub(crate) fn serialize_lookup_map<S>(
    lookup_map: &HashMap<(String, u16), SmolStr>,
    serializer: S,
) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    let mut map = serializer.serialize_map(Some(lookup_map.len()))?;
    for ((kind, index), name) in lookup_map {
        let key = format!("{}-{}", kind, index);
        map.serialize_entry(&key, name)?;
    }
    map.end()
}

pub(crate) fn serialize_language_systems<S>(
    language_systems: &IndexMap<Tag, IndexSet<Tag>>,
    serializer: S,
) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    let mut map = serializer.serialize_map(Some(language_systems.len()))?;
    for (script_tag, lang_sys_tags) in language_systems {
        let lang_sys_tags_vec: Vec<String> =
            lang_sys_tags.iter().map(|tag| tag.to_string()).collect();
        map.serialize_entry(&script_tag.to_string(), &lang_sys_tags_vec)?;
    }
    map.end()
}

pub(crate) fn serialize_features<S>(
    features: &IndexMap<SmolStr, Vec<Statement>>,
    serializer: S,
) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    let mut map = serializer.serialize_map(Some(features.len()))?;
    for (feature_name, lookups) in features {
        map.serialize_entry(
            &feature_name.to_string(),
            &lookups
                .iter()
                .map(|statement| match statement {
                    Statement::LookupReference(reference) => reference.lookup_name.clone(),
                    statement => statement.as_fea(""),
                })
                .collect::<Vec<String>>(),
        )?;
    }
    map.end()
}

pub(crate) fn serialize_named_classes<S>(
    named_classes: &IndexMap<SmolStr, GlyphClass>,
    serializer: S,
) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    let mut map = serializer.serialize_map(Some(named_classes.len()))?;
    for (class_name, glyph_class) in named_classes {
        map.serialize_entry(&class_name.to_string(), &glyph_class.as_fea(""))?;
    }
    map.end()
}