Skip to main content

fc_match/
fc-match.rs

1use std::{env, ffi::CString};
2
3use fontconfig::{self, FontSet, Fontconfig, FontconfigError};
4
5fn main() -> Result<(), FontconfigError> {
6    let fc = Fontconfig::new().expect("unable to init Fontconfig");
7
8    let Some(family) = env::args().nth(1) else {
9        eprintln!("Error: font family not specified");
10        eprintln!(
11            "Usage: {}: family",
12            env::args().next().as_deref().unwrap_or("fc-list")
13        );
14        return Ok(());
15    };
16    let family = CString::new(family)?;
17
18    let mut pattern = fontconfig::Pattern::new(&fc)?;
19    pattern.add_string(fontconfig::FC_FAMILY, &family)?;
20
21    let matched = pattern.font_match()?;
22    let mut fontset = FontSet::new(&fc)?;
23    fontset.add_pattern(matched)?;
24
25    for pattern in fontset.iter() {
26        println!(
27            "{}[{}] ({}): {}, weight = {}, width = {}, slant = {}",
28            pattern.filename()?,
29            pattern.face_index()?,
30            pattern
31                .format()
32                .map(|f| f.to_string())
33                .unwrap_or_else(|_| String::from("Unknown")),
34            pattern.name()?,
35            pattern.weight()?,
36            pattern.width()?,
37            pattern.slant()?
38        )
39    }
40    Ok(())
41}