no bug - Import translations from android-l10n r=release a=l10n CLOSED TREE
[gecko.git] / security / manager / ssl / rsclientcerts / src / error.rs
blob6ef9062d32171273ac97b2090535f30055b7bfbb
1 /* -*- Mode: rust; rust-indent-offset: 4 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 use std::fmt;
8 /// Helper macro to create an Error that knows which file and line it occurred
9 /// on. Can optionally have some extra information as a String.
10 #[macro_export]
11 macro_rules! error_here {
12     ($error_type:expr) => {
13         Error::new($error_type, file!(), line!(), None)
14     };
15     ($error_type:expr, $info:expr) => {
16         Error::new($error_type, file!(), line!(), Some($info))
17     };
20 /// Error type for identifying errors in this crate. Use the error_here! macro
21 /// to instantiate.
22 #[derive(Debug)]
23 pub struct Error {
24     typ: ErrorType,
25     file: &'static str,
26     line: u32,
27     info: Option<String>,
30 impl Error {
31     pub fn new(typ: ErrorType, file: &'static str, line: u32, info: Option<String>) -> Error {
32         Error {
33             typ,
34             file,
35             line,
36             info,
37         }
38     }
41 impl fmt::Display for Error {
42     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
43         if let Some(info) = &self.info {
44             write!(f, "{} at {}:{} ({})", self.typ, self.file, self.line, info)
45         } else {
46             write!(f, "{} at {}:{}", self.typ, self.file, self.line)
47         }
48     }
51 impl Clone for Error {
52     fn clone(&self) -> Self {
53         Error {
54             typ: self.typ,
55             file: self.file,
56             line: self.line,
57             info: self.info.as_ref().cloned(),
58         }
59     }
61     fn clone_from(&mut self, source: &Self) {
62         self.typ = source.typ;
63         self.file = source.file;
64         self.line = source.line;
65         self.info = source.info.as_ref().cloned();
66     }
69 #[derive(Copy, Clone, Debug)]
70 pub enum ErrorType {
71     /// An error in an external library or resource.
72     ExternalError,
73     /// Unexpected extra input (e.g. in an ASN.1 encoding).
74     ExtraInput,
75     /// Invalid argument.
76     InvalidArgument,
77     /// Invalid data input.
78     InvalidInput,
79     /// An internal library failure (e.g. an expected invariant failed).
80     LibraryFailure,
81     /// Truncated input (e.g. in an ASN.1 encoding).
82     TruncatedInput,
83     /// Unsupported input.
84     UnsupportedInput,
85     /// A given value could not be represented in the type used for it.
86     ValueTooLarge,
89 impl fmt::Display for ErrorType {
90     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
91         let error_type_str = match self {
92             ErrorType::ExternalError => "ExternalError",
93             ErrorType::ExtraInput => "ExtraInput",
94             ErrorType::InvalidArgument => "InvalidArgument",
95             ErrorType::InvalidInput => "InvalidInput",
96             ErrorType::LibraryFailure => "LibraryFailure",
97             ErrorType::TruncatedInput => "TruncatedInput",
98             ErrorType::UnsupportedInput => "UnsupportedInput",
99             ErrorType::ValueTooLarge => "ValueTooLarge",
100         };
101         write!(f, "{}", error_type_str)
102     }