query/
query.rs

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