1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 use nserror::{
6     nsresult, NS_ERROR_FAILURE, NS_ERROR_ILLEGAL_VALUE, NS_ERROR_NOT_AVAILABLE, NS_ERROR_UNEXPECTED,
7 };
8 use rkv::{MigrateError as RkvMigrateError, StoreError as RkvStoreError};
9 use serde_json::Error as SerdeJsonError;
10 use std::{io::Error as IoError, str::Utf8Error, string::FromUtf16Error, sync::PoisonError};
11 use thiserror::Error;
12 
13 pub(crate) type XULStoreResult<T> = Result<T, XULStoreError>;
14 
15 #[derive(Debug, Error)]
16 pub(crate) enum XULStoreError {
17     #[error("error converting bytes: {0:?}")]
18     ConvertBytes(#[from] Utf8Error),
19 
20     #[error("error converting string: {0:?}")]
21     ConvertString(#[from] FromUtf16Error),
22 
23     #[error("I/O error: {0:?}")]
24     IoError(#[from] IoError),
25 
26     #[error("iteration is finished")]
27     IterationFinished,
28 
29     #[error("JSON error: {0}")]
30     JsonError(#[from] SerdeJsonError),
31 
32     #[error("error result {0}")]
33     NsResult(#[from] nsresult),
34 
35     #[error("poison error getting read/write lock")]
36     PoisonError,
37 
38     #[error("migrate error: {0:?}")]
39     RkvMigrateError(#[from] RkvMigrateError),
40 
41     #[error("store error: {0:?}")]
42     RkvStoreError(#[from] RkvStoreError),
43 
44     #[error("id or attribute name too long")]
45     IdAttrNameTooLong,
46 
47     #[error("unavailable")]
48     Unavailable,
49 
50     #[error("unexpected key: {0:?}")]
51     UnexpectedKey(String),
52 
53     #[error("unexpected value")]
54     UnexpectedValue,
55 }
56 
57 impl From<XULStoreError> for nsresult {
from(err: XULStoreError) -> nsresult58     fn from(err: XULStoreError) -> nsresult {
59         match err {
60             XULStoreError::ConvertBytes(_) => NS_ERROR_FAILURE,
61             XULStoreError::ConvertString(_) => NS_ERROR_FAILURE,
62             XULStoreError::IoError(_) => NS_ERROR_FAILURE,
63             XULStoreError::IterationFinished => NS_ERROR_FAILURE,
64             XULStoreError::JsonError(_) => NS_ERROR_FAILURE,
65             XULStoreError::NsResult(result) => result,
66             XULStoreError::PoisonError => NS_ERROR_UNEXPECTED,
67             XULStoreError::RkvMigrateError(_) => NS_ERROR_FAILURE,
68             XULStoreError::RkvStoreError(_) => NS_ERROR_FAILURE,
69             XULStoreError::IdAttrNameTooLong => NS_ERROR_ILLEGAL_VALUE,
70             XULStoreError::Unavailable => NS_ERROR_NOT_AVAILABLE,
71             XULStoreError::UnexpectedKey(_) => NS_ERROR_UNEXPECTED,
72             XULStoreError::UnexpectedValue => NS_ERROR_UNEXPECTED,
73         }
74     }
75 }
76 
77 impl<T> From<PoisonError<T>> for XULStoreError {
from(_: PoisonError<T>) -> XULStoreError78     fn from(_: PoisonError<T>) -> XULStoreError {
79         XULStoreError::PoisonError
80     }
81 }
82