1use thiserror::Error;
2
3#[derive(Error, Clone, Debug, PartialEq, Eq)]
4#[cfg_attr(feature = "serde-error", derive(serde::Serialize, serde::Deserialize))]
5pub enum LanguageError {
6 #[error("datalog parsing error: {0:?}")]
7 ParseError(ParseErrors),
8 #[error("datalog parameters must all be bound, provided values must all be used.\nMissing parameters: {missing_parameters:?}\nUnused parameters: {unused_parameters:?}")]
9 Parameters {
10 missing_parameters: Vec<String>,
11 unused_parameters: Vec<String>,
12 },
13}
14
15#[derive(Clone, Debug, PartialEq, Eq)]
16#[cfg_attr(feature = "serde-error", derive(serde::Serialize, serde::Deserialize))]
17pub struct ParseErrors {
18 pub errors: Vec<ParseError>,
19}
20
21#[derive(Clone, Debug, PartialEq, Eq)]
22#[cfg_attr(feature = "serde-error", derive(serde::Serialize, serde::Deserialize))]
23pub struct ParseError {
24 pub input: String,
25 pub message: Option<String>,
26}
27
28impl<'a> From<crate::parser::Error<'a>> for ParseError {
29 fn from(e: crate::parser::Error<'a>) -> Self {
30 ParseError {
31 input: e.input.to_string(),
32 message: e.message,
33 }
34 }
35}
36
37impl<'a> From<crate::parser::Error<'a>> for ParseErrors {
38 fn from(error: crate::parser::Error<'a>) -> Self {
39 ParseErrors {
40 errors: vec![error.into()],
41 }
42 }
43}
44
45impl<'a> From<Vec<crate::parser::Error<'a>>> for ParseErrors {
46 fn from(errors: Vec<crate::parser::Error<'a>>) -> Self {
47 ParseErrors {
48 errors: errors.into_iter().map(|e| e.into()).collect(),
49 }
50 }
51}
52
53impl<'a> From<crate::parser::Error<'a>> for LanguageError {
54 fn from(e: crate::parser::Error<'a>) -> Self {
55 LanguageError::ParseError(e.into())
56 }
57}
58
59impl<'a> From<Vec<crate::parser::Error<'a>>> for LanguageError {
60 fn from(e: Vec<crate::parser::Error<'a>>) -> Self {
61 LanguageError::ParseError(e.into())
62 }
63}