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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
// font-kit/src/error.rs
//
// Copyright © 2018 The Pathfinder Project Developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//! Various types of errors that `font-kit` can return.
use std::borrow::Cow;
use std::convert::From;
use std::error::Error;
use std::io;
macro_rules! impl_display {
($enum:ident, {$($variant:pat => $fmt_string:expr),+$(,)* }) => {
impl ::std::fmt::Display for $enum {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
use self::$enum::*;
match &self {
$(
$variant => write!(f, "{}", $fmt_string),
)+
}
}
}
};
}
/// Reasons why a loader might fail to load a font.
#[derive(Debug)]
pub enum FontLoadingError {
/// The data was of a format the loader didn't recognize.
UnknownFormat,
/// Attempted to load an invalid index in a TrueType or OpenType font collection.
///
/// For example, if a `.ttc` file has 2 fonts in it, and you ask for the 5th one, you'll get
/// this error.
NoSuchFontInCollection,
/// Attempted to load a malformed or corrupted font.
Parse,
/// Attempted to load a font from the filesystem, but there is no filesystem (e.g. in
/// WebAssembly).
NoFilesystem,
/// A disk or similar I/O error occurred while attempting to load the font.
Io(io::Error),
}
impl Error for FontLoadingError {}
impl_display! { FontLoadingError, {
UnknownFormat => "unknown format",
NoSuchFontInCollection => "no such font in the collection",
Parse => "parse error",
NoFilesystem => "no filesystem present",
Io(e) => format!("I/O error: {}", e),
}
}
impl From<io::Error> for FontLoadingError {
fn from(error: io::Error) -> FontLoadingError {
FontLoadingError::Io(error)
}
}
/// Reasons why a font might fail to load a glyph.
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum GlyphLoadingError {
/// The font didn't contain a glyph with that ID.
NoSuchGlyph,
/// A platform function returned an error.
PlatformError,
}
impl Error for GlyphLoadingError {}
impl_display! { GlyphLoadingError, {
NoSuchGlyph => "no such glyph",
PlatformError => "platform error",
}
}
#[cfg(target_family = "windows")]
impl From<winapi::um::winnt::HRESULT> for GlyphLoadingError {
fn from(_err: winapi::um::winnt::HRESULT) -> GlyphLoadingError {
GlyphLoadingError::PlatformError
}
}
/// Reasons why a source might fail to look up a font or fonts.
#[derive(Clone, PartialEq, Debug)]
pub enum SelectionError {
/// No font matching the given query was found.
NotFound,
/// The source was inaccessible because of an I/O or similar error.
CannotAccessSource {
/// Additional diagnostic information may include file name
reason: Option<Cow<'static, str>>,
},
}
impl Error for SelectionError {}
impl_display! { SelectionError, {
NotFound => "no font found",
CannotAccessSource { reason: ref maybe_cow } => maybe_cow.as_deref().unwrap_or("failed to access source")
}
}