Skip to main content

query/
query.rs

1//! Detailed font query patterns
2//!
3//! Shows how to query by family name, style (bold/italic), generic families,
4//! list fonts, and search by name substring.
5//!
6//! Run with:
7//!   cargo run --example query
8
9use rust_fontconfig::{FcFontCache, FcPattern, FcWeight, PatternMatch};
10
11fn main() {
12    println!("Building font cache...");
13    let cache = FcFontCache::build();
14    println!("Font cache built with {} fonts\n", cache.list().len());
15
16    // ── Query by family name ──
17    println!("=== Query by Family Name ===");
18    let mut trace = Vec::new();
19    let pattern = FcPattern {
20        family: Some("Arial".to_string()),
21        ..Default::default()
22    };
23
24    if let Some(result) = cache.query(&pattern, &mut trace) {
25        println!("Found Arial:");
26        println!("  Font ID: {:?}", result.id);
27        if let Some(meta) = cache.get_metadata_by_id(&result.id) {
28            println!("  Family: {:?}", meta.family);
29            println!("  Weight: {:?}", meta.weight);
30            println!("  Italic: {:?}", meta.italic);
31        }
32        if let Some(source) = cache.get_font_by_id(&result.id) {
33            match source {
34                rust_fontconfig::FontSource::Disk(path) => println!("  Path: {}", path.path),
35                rust_fontconfig::FontSource::Memory(font) => {
36                    println!("  Memory font: {}", font.id)
37                }
38            }
39        }
40    } else {
41        println!("Arial not found");
42    }
43
44    // ── Query generic family ──
45    println!("\n=== Query Generic 'serif' ===");
46    trace.clear();
47    if let Some(result) = cache.query(
48        &FcPattern {
49            family: Some("serif".to_string()),
50            ..Default::default()
51        },
52        &mut trace,
53    ) {
54        if let Some(meta) = cache.get_metadata_by_id(&result.id) {
55            println!(
56                "Found: {:?}",
57                meta.name.as_ref().or(meta.family.as_ref())
58            );
59        }
60    }
61
62    // ── Query by style (bold + italic) ──
63    println!("\n=== Query Bold Italic ===");
64    trace.clear();
65    if let Some(result) = cache.query(
66        &FcPattern {
67            family: Some("sans-serif".to_string()),
68            weight: FcWeight::Bold,
69            italic: PatternMatch::True,
70            ..Default::default()
71        },
72        &mut trace,
73    ) {
74        if let Some(meta) = cache.get_metadata_by_id(&result.id) {
75            println!(
76                "Found: {:?} weight={:?} italic={:?}",
77                meta.name.as_ref().or(meta.family.as_ref()),
78                meta.weight,
79                meta.italic
80            );
81        }
82    }
83
84    // ── List bold fonts ──
85    println!("\n=== First 5 Bold Fonts ===");
86    for (meta, id) in cache
87        .list()
88        .into_iter()
89        .filter(|(m, _)| matches!(m.weight, FcWeight::Bold | FcWeight::ExtraBold | FcWeight::Black))
90        .take(5)
91    {
92        println!(
93            "  {:?}: {:?}",
94            id,
95            meta.name.as_ref().or(meta.family.as_ref())
96        );
97    }
98
99    // ── Search by name substring ──
100    println!("\n=== Fonts with 'Mono' in name ===");
101    for (meta, _id) in cache.list().into_iter().filter(|(m, _)| {
102        m.name
103            .as_ref()
104            .map(|n| n.contains("Mono"))
105            .unwrap_or(false)
106            || m.family
107                .as_ref()
108                .map(|f| f.contains("Mono"))
109                .unwrap_or(false)
110    }).take(10) {
111        println!(
112            "  {:?}",
113            meta.name.as_ref().or(meta.family.as_ref())
114        );
115    }
116}