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