Skip to main content

ferroui_base/media/
font_feature_collection.rs

1use crate::media::media_collection::media_collection_type;
2use crate::media::{FontFeature, MediaCollection};
3use crate::utilities::{FormatError, SpanStringTokenizer};
4
5media_collection_type!(
6    /// List of font feature settings.
7    ///
8    /// A shared handle to an observable list; equality is reference equality.
9    FontFeatureCollection,
10    FontFeature
11);
12
13impl FontFeatureCollection {
14    /// Creates an empty collection.
15    pub fn new() -> Self {
16        Self(MediaCollection::new())
17    }
18
19    /// Creates a collection from features.
20    pub fn from_items(font_features: impl IntoIterator<Item = FontFeature>) -> Self {
21        Self(MediaCollection::from_items(font_features))
22    }
23
24    /// Parses a comma separated list of font features.
25    pub fn parse(s: &str) -> Result<FontFeatureCollection, FormatError> {
26        let mut features = Vec::new();
27
28        SpanStringTokenizer::with_message(s, "Invalid font feature specification.").scope(|tokenizer| {
29            while let Some(token) = tokenizer.try_read_span()? {
30                features.push(FontFeature::parse(token));
31            }
32            Ok(())
33        })?;
34
35        Ok(FontFeatureCollection::from_items(features))
36    }
37}