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
use crate::{lang, model, TypeCheckError};
use std::io;

#[derive(Debug)]
pub enum VError {
	ParseError(nom::error::Error<String>),
	ParseIncompleteError,
	TypeCheckError(TypeCheckError),
	IOError(io::Error),
	ModelError(model::ModelError),
	GeneratorError(lang::GeneratorError),
    NoInputFiles,
}

impl From<nom::error::Error<&str>> for VError {
	fn from(err: nom::error::Error<&str>) -> Self {
		VError::ParseError(nom::error::Error {
			input: String::from(err.input),
			code: err.code,
		})
	}
}

impl <E> From<nom::Err<E>> for VError where Self : From<E> {
	fn from(err: nom::Err<E>) -> Self {
		match err {
			nom::Err::Incomplete(_) => VError::ParseIncompleteError,
			nom::Err::Error(err) => VError::from(err),
			nom::Err::Failure(err) => VError::from(err),
		}
	}
}

impl From<io::Error> for VError {
	fn from(err: io::Error) -> Self {
		VError::IOError(err)
	}
}

impl From<TypeCheckError> for VError {
	fn from(error: TypeCheckError) -> Self {
		VError::TypeCheckError(error)
	}
}

impl From<model::ModelError> for VError {
	fn from(error: model::ModelError) -> Self {
		VError::ModelError(error)
	}
}

impl From<lang::GeneratorError> for VError {
	fn from(error: lang::GeneratorError) -> Self {
		VError::GeneratorError(error)
	}
}