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
use crate::*;
use libR_sys::*;
use std::os::raw;
static mut R_ERROR_BUF: Vec<u8> = Vec::new();
#[doc(hidden)]
pub fn unwrap_or_throw<T>(r: std::result::Result<T, &'static str>) -> T {
unsafe {
match r {
Err(e) => {
R_ERROR_BUF.clear();
R_ERROR_BUF.extend(e.bytes());
R_ERROR_BUF.push(0);
Rf_error(R_ERROR_BUF.as_slice().as_ptr() as *mut raw::c_char);
unreachable!("");
}
Ok(v) => v,
}
}
}
#[derive(Debug, PartialEq)]
pub enum Error {
Panic {},
NotFound,
NotAVectorType,
EvalError { code: Robj, error: i32 },
ParseError { code: String, status: u32 },
NamesLengthMismatch,
Other(String),
}
pub type Result<T> = std::result::Result<T, Error>;
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
None
}
}
impl From<Box<dyn std::error::Error>> for Error {
fn from(err: Box<dyn std::error::Error>) -> Error {
Error::Other(format!("{}", err))
}
}
impl From<&str> for Error {
fn from(err: &str) -> Error {
Error::Other(err.to_string())
}
}
impl From<String> for Error {
fn from(err: String) -> Error {
Error::Other(err)
}
}