about summary refs log tree commit diff
path: root/src/librustc_errors/registry.rs
diff options
context:
space:
mode:
authorJake Vossen <jake@vossen.dev>2020-02-28 15:32:09 -0700
committerJake Vossen <jake@vossen.dev>2020-02-29 11:53:51 -0700
commit5f3ffee6b77f073b78bdc76e7a0f4811bc39e7f9 (patch)
treee5f1636fb10b7b570078b96b1d7e711e663f3776 /src/librustc_errors/registry.rs
parente9bca510fe17354f876aa289bb39d347d7c69c69 (diff)
downloadrust-5f3ffee6b77f073b78bdc76e7a0f4811bc39e7f9.tar.gz
rust-5f3ffee6b77f073b78bdc76e7a0f4811bc39e7f9.zip
added `try_find_description` to distinguish no desc from invalid code
Diffstat (limited to 'src/librustc_errors/registry.rs')
-rw-r--r--src/librustc_errors/registry.rs24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/librustc_errors/registry.rs b/src/librustc_errors/registry.rs
index 771542cb06f..c92a9d04775 100644
--- a/src/librustc_errors/registry.rs
+++ b/src/librustc_errors/registry.rs
@@ -1,16 +1,32 @@
 use rustc_data_structures::fx::FxHashMap;
 
+#[derive(Debug)]
+pub struct InvalidErrorCode;
+
 #[derive(Clone)]
 pub struct Registry {
-    descriptions: FxHashMap<&'static str, &'static str>,
+    long_descriptions: FxHashMap<&'static str, Option<&'static str>>,
 }
 
 impl Registry {
-    pub fn new(descriptions: &[(&'static str, &'static str)]) -> Registry {
-        Registry { descriptions: descriptions.iter().cloned().collect() }
+    pub fn new(long_descriptions: &[(&'static str, Option<&'static str>)]) -> Registry {
+        Registry { long_descriptions: long_descriptions.iter().cloned().collect() }
     }
 
+    /// This will panic if an invalid error code is passed in
     pub fn find_description(&self, code: &str) -> Option<&'static str> {
-        self.descriptions.get(code).cloned()
+        self.try_find_description(code).unwrap()
+    }
+    /// Returns `InvalidErrorCode` if the code requested does not exist in the
+    /// registry. Otherwise, returns an `Option` where `None` means the error
+    /// code is valid but has no extended information.
+    pub fn try_find_description(
+        &self,
+        code: &str,
+    ) -> Result<Option<&'static str>, InvalidErrorCode> {
+        if !self.long_descriptions.contains_key(code) {
+            return Err(InvalidErrorCode);
+        }
+        Ok(self.long_descriptions.get(code).unwrap().clone())
     }
 }