1 use super::ErrorFormat; 2 /// 解析错误,错误信息应该包括文件名以及行号 3 #[repr(i32)] 4 #[derive(Debug, PartialEq, Eq, Clone)] 5 #[allow(dead_code, non_camel_case_types)] 6 pub enum ParseErrorType { 7 /// 不合法参数 8 EINVAL, 9 /// 结果过大 Result too large. 10 ERANGE, 11 /// 重复定义 12 EREDEF, 13 /// 未预料到的空值 14 EUnexpectedEmpty, 15 /// 语法错误 16 ESyntaxError, 17 /// 非法文件描述符 18 EBADF, 19 /// 非法文件 20 EFILE, 21 /// 不是目录 22 ENODIR, 23 /// 循环依赖 24 ECircularDependency, 25 } 26 /// 错误信息应该包括错误类型ParseErrorType,当前解析的文件名,当前解析的行号 27 #[derive(Debug, PartialEq, Eq, Clone)] 28 pub struct ParseError(ParseErrorType, String, usize); 29 30 impl ParseError { 31 pub fn new(error_type: ParseErrorType, file_name: String, line_number: usize) -> ParseError { 32 ParseError(error_type, file_name, line_number) 33 } 34 35 pub fn set_file(&mut self, path: &str) { 36 self.1 = path.to_string(); 37 } 38 39 pub fn set_linenum(&mut self, linenum: usize) { 40 self.2 = linenum; 41 } 42 } 43 44 impl ErrorFormat for ParseError { 45 fn error_format(&self) -> String { 46 format!( 47 "Parse Error!,Error Type: {:?}, File: {}, Line: {}", 48 self.0, self.1, self.2 49 ) 50 } 51 } 52