1use crate::span::Span;
4use thiserror::Error;
5
6#[derive(Error, Debug)]
7pub enum KoreError {
8 #[error("Lexer error at {span:?}: {message}")]
9 Lexer { message: String, span: Span },
10
11 #[error("Parser error at {span:?}: {message}")]
12 Parser { message: String, span: Span },
13
14 #[error("Type error at {span:?}: {message}")]
15 Type { message: String, span: Span },
16
17 #[error("Effect error at {span:?}: {message}")]
18 Effect { message: String, span: Span },
19
20 #[error("Borrow error at {span:?}: {message}")]
21 Borrow { message: String, span: Span },
22
23 #[error("Codegen error at {span:?}: {message}")]
24 Codegen { message: String, span: Span },
25
26 #[error("Runtime error: {message}")]
27 Runtime { message: String },
28
29 #[error("IO error: {0}")]
30 Io(#[from] std::io::Error),
31}
32
33impl KoreError {
34 pub fn lexer(message: impl Into<String>, span: Span) -> Self {
35 KoreError::Lexer {
36 message: message.into(),
37 span,
38 }
39 }
40
41 pub fn parser(message: impl Into<String>, span: Span) -> Self {
42 KoreError::Parser {
43 message: message.into(),
44 span,
45 }
46 }
47
48 pub fn type_error(message: impl Into<String>, span: Span) -> Self {
49 KoreError::Type {
50 message: message.into(),
51 span,
52 }
53 }
54
55 pub fn effect_error(message: impl Into<String>, span: Span) -> Self {
56 KoreError::Effect {
57 message: message.into(),
58 span,
59 }
60 }
61
62 pub fn borrow_error(message: impl Into<String>, span: Span) -> Self {
63 KoreError::Borrow {
64 message: message.into(),
65 span,
66 }
67 }
68
69 pub fn codegen(message: impl Into<String>, span: Span) -> Self {
70 KoreError::Codegen {
71 message: message.into(),
72 span,
73 }
74 }
75
76 pub fn runtime(message: impl Into<String>) -> Self {
77 KoreError::Runtime {
78 message: message.into(),
79 }
80 }
81}
82
83pub type KoreResult<T> = Result<T, KoreError>;
85