shader_sense/
shader_error.rs

1use core::fmt;
2
3use crate::symbols::symbols::ShaderRange;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub enum ShaderDiagnosticSeverity {
7    Error,
8    Warning,
9    Information,
10    Hint,
11}
12impl fmt::Display for ShaderDiagnosticSeverity {
13    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
14        match self {
15            ShaderDiagnosticSeverity::Error => write!(f, "error"),
16            ShaderDiagnosticSeverity::Warning => write!(f, "warning"),
17            ShaderDiagnosticSeverity::Information => write!(f, "info"),
18            ShaderDiagnosticSeverity::Hint => write!(f, "hint"),
19        }
20    }
21}
22
23impl From<String> for ShaderDiagnosticSeverity {
24    fn from(value: String) -> Self {
25        match value.as_str() {
26            "error" => ShaderDiagnosticSeverity::Error,
27            "warning" => ShaderDiagnosticSeverity::Warning,
28            "info" => ShaderDiagnosticSeverity::Information,
29            "hint" => ShaderDiagnosticSeverity::Hint,
30            _ => ShaderDiagnosticSeverity::Error,
31        }
32    }
33}
34
35impl ShaderDiagnosticSeverity {
36    pub fn is_required(&self, required_severity: ShaderDiagnosticSeverity) -> bool {
37        self.get_enum_index() <= required_severity.get_enum_index()
38    }
39    fn get_enum_index(&self) -> u32 {
40        match self {
41            ShaderDiagnosticSeverity::Error => 0,
42            ShaderDiagnosticSeverity::Warning => 1,
43            ShaderDiagnosticSeverity::Information => 2,
44            ShaderDiagnosticSeverity::Hint => 3,
45        }
46    }
47}
48
49#[derive(Debug, Clone)]
50pub struct ShaderDiagnostic {
51    pub severity: ShaderDiagnosticSeverity,
52    pub error: String,
53    pub range: ShaderRange,
54}
55#[derive(Debug, Default, Clone)]
56pub struct ShaderDiagnosticList {
57    pub diagnostics: Vec<ShaderDiagnostic>,
58}
59
60#[derive(Debug)]
61pub enum ShaderError {
62    ValidationError(String),
63    NoSymbol,
64    ParseSymbolError(String),
65    SymbolQueryError(String, ShaderRange),
66    IoErr(std::io::Error),
67    InternalErr(String),
68}
69
70impl From<regex::Error> for ShaderError {
71    fn from(error: regex::Error) -> Self {
72        match error {
73            regex::Error::CompiledTooBig(err) => {
74                ShaderError::InternalErr(format!("Regex compile too big: {}", err))
75            }
76            regex::Error::Syntax(err) => {
77                ShaderError::InternalErr(format!("Regex syntax invalid: {}", err))
78            }
79            err => ShaderError::InternalErr(format!("Regex error: {:#?}", err)),
80        }
81    }
82}
83
84impl fmt::Display for ShaderError {
85    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
86        match self {
87            ShaderError::IoErr(err) => write!(f, "IoError: {}", err),
88            ShaderError::InternalErr(err) => write!(f, "Error: {}", err),
89            ShaderError::NoSymbol => write!(f, "NoSymbol"),
90            ShaderError::ParseSymbolError(err) => write!(f, "ParseSymbolError: {}", err),
91            ShaderError::ValidationError(err) => write!(f, "ValidationError: {}", err),
92            ShaderError::SymbolQueryError(err, range) => {
93                write!(f, "SymbolQueryError: {} at {:?}", err, range)
94            }
95        }
96    }
97}
98
99impl From<std::io::Error> for ShaderError {
100    fn from(err: std::io::Error) -> Self {
101        ShaderError::IoErr(err)
102    }
103}
104impl From<ShaderDiagnostic> for ShaderDiagnosticList {
105    fn from(err: ShaderDiagnostic) -> Self {
106        Self {
107            diagnostics: vec![err],
108        }
109    }
110}
111impl ShaderDiagnosticList {
112    pub fn empty() -> Self {
113        Self {
114            diagnostics: Vec::new(),
115        }
116    }
117    pub fn push(&mut self, error: ShaderDiagnostic) {
118        self.diagnostics.push(error);
119    }
120    pub fn is_empty(&self) -> bool {
121        self.diagnostics.is_empty()
122    }
123}