summaryrefslogtreecommitdiffstats
path: root/toolkit/components/xulstore/src/error.rs
blob: d1aaa023f98295d8f99f16abfa23b2cf56ae0b77 (plain)
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)
    }
}