user-agent-parser 0.5.0

A parser to get the product, OS, device, cpu, and engine information from a user agent, inspired by https://github.com/faisalman/ua-parser-js and https://github.com/ua-parser/uap-core
Documentation
use regex::Regex;
use yaml_rust::Yaml;

use crate::{
    UserAgentParserError,
    regexes::{Replacement, from_yaml_section, optional_replacement},
};

#[derive(Debug)]
pub(crate) struct ProductRegex {
    pub(crate) regex:              Regex,
    pub(crate) family_replacement: Option<Replacement>,
    pub(crate) v1_replacement:     Option<Replacement>,
    pub(crate) v2_replacement:     Option<Replacement>,
    pub(crate) v3_replacement:     Option<Replacement>,
}

impl ProductRegex {
    pub(crate) fn from_yaml(yaml: &Yaml) -> Result<Vec<ProductRegex>, UserAgentParserError> {
        let yaml_family_replacement = Yaml::String("family_replacement".to_string());
        let yaml_v1_replacement = Yaml::String("v1_replacement".to_string());
        let yaml_v2_replacement = Yaml::String("v2_replacement".to_string());
        let yaml_v3_replacement = Yaml::String("v3_replacement".to_string());

        from_yaml_section(yaml, |regex, yaml| {
            Ok(ProductRegex {
                regex,
                family_replacement: optional_replacement(yaml, &yaml_family_replacement)?,
                v1_replacement: optional_replacement(yaml, &yaml_v1_replacement)?,
                v2_replacement: optional_replacement(yaml, &yaml_v2_replacement)?,
                v3_replacement: optional_replacement(yaml, &yaml_v3_replacement)?,
            })
        })
    }
}