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
use allsorts::error::{ParseError, ShapingError};

#[derive(Clone, Debug, PartialEq)]
pub struct ImtError {
	pub src: ImtErrorSrc,
	pub ty: ImtErrorTy,
}

#[derive(Clone, Debug, PartialEq)]
pub enum ImtErrorSrc {
	Unknown,
	File,
	Cmap,
	Maxp,
	GDEF,
	GPOS,
	Hhea,
	Hmtx,
	Head,
	Loca,
	Glyf,
	Gsub,
	GsubInfo,
	Glyph,
	Bitmap,
	Vhea,
	Ilmenite,
	Shaper,
}

#[derive(Clone, Debug, PartialEq)]
pub enum ImtErrorTy {
	Unimplemented,
	FileRead,
	FileGeneric,
	FileBadEof,
	FileBadValue,
	FileBadVersion,
	FileBadOffset,
	FileBadIndex,
	FileLimitExceeded,
	FileMissingValue,
	FileCompressionError,
	FileUnsupportedFormat,
	FileMissingTable,
	FileMissingSubTable,
	MissingIndex,
	MissingGlyph,
	MissingFont,
	UnimplementedDataTy,
	Other(String),
}

impl ImtError {
	pub fn unimplemented() -> Self {
		Self::src_and_ty(ImtErrorSrc::Unknown, ImtErrorTy::Unimplemented)
	}

	pub fn src_and_ty(src: ImtErrorSrc, ty: ImtErrorTy) -> Self {
		ImtError {
			src,
			ty,
		}
	}

	pub fn allsorts_parse(src: ImtErrorSrc, err: ParseError) -> Self {
		ImtError {
			src,
			ty: match err {
				ParseError::BadEof => ImtErrorTy::FileBadEof,
				ParseError::BadValue => ImtErrorTy::FileBadValue,
				ParseError::BadVersion => ImtErrorTy::FileBadVersion,
				ParseError::BadOffset => ImtErrorTy::FileBadOffset,
				ParseError::BadIndex => ImtErrorTy::FileBadIndex,
				ParseError::LimitExceeded => ImtErrorTy::FileLimitExceeded,
				ParseError::MissingValue => ImtErrorTy::FileMissingValue,
				ParseError::CompressionError => ImtErrorTy::FileCompressionError,
				ParseError::NotImplemented => ImtErrorTy::FileGeneric,
			},
		}
	}

	// TODO: Implement mapping of ShapingError
	pub fn allsorts_shaping(src: ImtErrorSrc, err: ShapingError) -> Self {
		println!("Basalt Text: Returning unimplemented error! src: {:?}, err: {:?}", src, err);

		Self::src_and_ty(src, ImtErrorTy::Unimplemented)
	}
}