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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use thiserror::Error;
#[derive(Error, Debug)]
pub enum OsoError {
#[error(transparent)]
Io(#[from] std::io::Error),
#[error(transparent)]
Polar(#[from] polar_core::error::PolarError),
#[error("failed to convert type from Polar")]
FromPolar,
#[error("policy files must have the .polar extension. {filename} does not.")]
IncorrectFileType { filename: String },
#[error("Invariant error: {source}")]
InvariantError {
#[from]
source: InvariantError,
},
#[error(transparent)]
TypeError(#[from] TypeError),
#[error("Unsupported operation {operation} for type {type_name}.")]
UnsupportedOperation {
operation: String,
type_name: String,
},
#[error("{operation} are unimplemented in oso-rust.")]
UnimplementedOperation { operation: String },
#[error("failed to convert type to Polar")]
ToPolar,
#[error("Class {name} already registered")]
DuplicateClassError { name: String },
#[error("{message}")]
Custom { message: String },
}
#[derive(Error, Debug)]
pub enum InvariantError {
#[error("Invalid receiver for method. {0}")]
InvalidReceiver(#[from] TypeError),
#[error("invalid receiver - this is a bug")]
MethodNotFound,
}
#[derive(Error, Debug)]
#[error("Type error: expected `{expected}`")]
pub struct TypeError {
pub expected: String,
}
impl TypeError {
pub fn invariant(self) -> InvariantError {
InvariantError::from(self)
}
pub fn user(self) -> OsoError {
OsoError::from(self)
}
}
pub type Result<T> = std::result::Result<T, OsoError>;