ucd-generate 0.3.0

A program for generating packed representations of the Unicode character database that can be efficiently searched.
use std::collections::{BTreeMap, BTreeSet};

use ucd_parse::{self, Age};

use crate::args::ArgMatches;
use crate::error::Result;
use crate::util::PropertyValues;

pub fn command(args: ArgMatches<'_>) -> Result<()> {
    let dir = args.ucd_dir()?;
    let propvals = PropertyValues::from_ucd_dir(&dir)?;
    let ages: Vec<Age> = ucd_parse::parse(&dir)?;

    let mut by_age: BTreeMap<String, BTreeSet<u32>> = BTreeMap::new();
    for x in &ages {
        let agename = propvals.canonical("Age", &x.age)?;
        by_age
            .entry(agename)
            .or_insert(BTreeSet::new())
            .extend(x.codepoints.into_iter().map(|c| c.value()));
    }

    let mut wtr = args.writer("age")?;
    wtr.names(by_age.keys())?;
    for (name, set) in by_age {
        wtr.ranges(&name, &set)?;
    }
    Ok(())
}