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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use nserror::{
nsresult, NS_ERROR_FAILURE, NS_ERROR_ILLEGAL_VALUE, NS_ERROR_NOT_AVAILABLE, NS_ERROR_UNEXPECTED,
};
use rkv::{MigrateError as RkvMigrateError, StoreError as RkvStoreError};
use serde_json::Error as SerdeJsonError;
use std::{io::Error as IoError, str::Utf8Error, string::FromUtf16Error, sync::PoisonError};
pub(crate) type XULStoreResult<T> = Result<T, XULStoreError>;
#[derive(Debug, Fail)]
pub(crate) enum XULStoreError {
#[fail(display = "error converting bytes: {:?}", _0)]
ConvertBytes(Utf8Error),
#[fail(display = "error converting string: {:?}", _0)]
ConvertString(FromUtf16Error),
#[fail(display = "I/O error: {:?}", _0)]
IoError(IoError),
#[fail(display = "iteration is finished")]
IterationFinished,
#[fail(display = "JSON error: {}", _0)]
JsonError(SerdeJsonError),
#[fail(display = "error result {}", _0)]
NsResult(nsresult),
#[fail(display = "poison error getting read/write lock")]
PoisonError,
#[fail(display = "migrate error: {:?}", _0)]
RkvMigrateError(RkvMigrateError),
#[fail(display = "store error: {:?}", _0)]
RkvStoreError(RkvStoreError),
#[fail(display = "id or attribute name too long")]
IdAttrNameTooLong,
#[fail(display = "unavailable")]
Unavailable,
#[fail(display = "unexpected key: {:?}", _0)]
UnexpectedKey(String),
#[fail(display = "unexpected value")]
UnexpectedValue,
}
impl From<XULStoreError> for nsresult {
fn from(err: XULStoreError) -> nsresult {
match err {
XULStoreError::ConvertBytes(_) => NS_ERROR_FAILURE,
XULStoreError::ConvertString(_) => NS_ERROR_FAILURE,
XULStoreError::IoError(_) => NS_ERROR_FAILURE,
XULStoreError::IterationFinished => NS_ERROR_FAILURE,
XULStoreError::JsonError(_) => NS_ERROR_FAILURE,
XULStoreError::NsResult(result) => result,
XULStoreError::PoisonError => NS_ERROR_UNEXPECTED,
XULStoreError::RkvMigrateError(_) => NS_ERROR_FAILURE,
XULStoreError::RkvStoreError(_) => NS_ERROR_FAILURE,
XULStoreError::IdAttrNameTooLong => NS_ERROR_ILLEGAL_VALUE,
XULStoreError::Unavailable => NS_ERROR_NOT_AVAILABLE,
XULStoreError::UnexpectedKey(_) => NS_ERROR_UNEXPECTED,
XULStoreError::UnexpectedValue => NS_ERROR_UNEXPECTED,
}
}
}
impl From<FromUtf16Error> for XULStoreError {
fn from(err: FromUtf16Error) -> XULStoreError {
XULStoreError::ConvertString(err)
}
}
impl From<nsresult> for XULStoreError {
fn from(result: nsresult) -> XULStoreError {
XULStoreError::NsResult(result)
}
}
impl<T> From<PoisonError<T>> for XULStoreError {
fn from(_: PoisonError<T>) -> XULStoreError {
XULStoreError::PoisonError
}
}
impl From<RkvMigrateError> for XULStoreError {
fn from(err: RkvMigrateError) -> XULStoreError {
XULStoreError::RkvMigrateError(err)
}
}
impl From<RkvStoreError> for XULStoreError {
fn from(err: RkvStoreError) -> XULStoreError {
XULStoreError::RkvStoreError(err)
}
}
impl From<Utf8Error> for XULStoreError {
fn from(err: Utf8Error) -> XULStoreError {
XULStoreError::ConvertBytes(err)
}
}
impl From<IoError> for XULStoreError {
fn from(err: IoError) -> XULStoreError {
XULStoreError::IoError(err)
}
}
impl From<SerdeJsonError> for XULStoreError {
fn from(err: SerdeJsonError) -> XULStoreError {
XULStoreError::JsonError(err)
}
}
|