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