1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
extern crate binary_reader;
mod formats;
pub mod types;
use binary_reader::BinaryReader;
use formats::{ttc::TTC, ttf::TTF};
use std::fs::File;
use std::io::{Error, ErrorKind};
use std::path::Path;
use types::Fonts;
pub fn read(path: &str) -> Result<Fonts, Error> {
let parsed = Path::new(&path);
let ext = parsed.extension().unwrap();
let mut file = File::open(&path)?;
let mut binary = BinaryReader::from_file(&mut file);
if ext == "ttf" || ext == "otf" {
let mut reader = TTF::new(&mut binary, 0);
match reader.get_data() {
Ok(data) => return Ok(data),
Err(err) => return Err(err),
}
} else if ext == "ttc" {
let reader = TTC::new(&mut binary);
match reader.get_data() {
Ok(data) => return Ok(data),
Err(err) => return Err(err),
}
}
Err(Error::new(
ErrorKind::InvalidInput,
format!("Invalid font file: {}", path),
))
}