1use std::{env, ffi::CString};
2
3use fontconfig::{self, 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 mut objects = fontconfig::ObjectSet::new(&fc)?;
22 objects.add(fontconfig::FC_FAMILY)?;
23 objects.add(fontconfig::FC_FILE)?;
24 objects.add(fontconfig::FC_FONTFORMAT)?;
25 objects.add(fontconfig::FC_INDEX)?;
26 objects.add(fontconfig::FC_STYLE)?;
27
28 let fontset = fontconfig::list_fonts(&pattern, Some(&objects))?;
29
30 for pattern in fontset.iter() {
31 let family = pattern.get_string(fontconfig::FC_FAMILY)?;
32 let style = pattern.get_string(fontconfig::FC_STYLE)?;
33
34 println!(
35 "{}[{}] ({}): {}:style={}",
36 pattern.filename()?,
37 pattern.face_index()?,
38 pattern
39 .format()
40 .map(|f| f.to_string())
41 .unwrap_or_else(|_| String::from("Unknown")),
42 family,
43 style
44 )
45 }
46 Ok(())
47}