]> git.lizzy.rs Git - rust.git/blobdiff - crates/ra_hir_expand/src/diagnostics.rs
Add a builder for DiagnosticSink
[rust.git] / crates / ra_hir_expand / src / diagnostics.rs
index 545cff9bd169ec882a4f1be1dc53dfacb627edec..6a5844f31ff3dd3f8bce13409aa0ac673b973fa3 100644 (file)
@@ -48,23 +48,6 @@ pub struct DiagnosticSink<'a> {
 }
 
 impl<'a> DiagnosticSink<'a> {
-    /// FIXME: split `new` and `on` into a separate builder type
-    pub fn new(cb: impl FnMut(&dyn Diagnostic) + 'a) -> DiagnosticSink<'a> {
-        DiagnosticSink { callbacks: Vec::new(), default_callback: Box::new(cb) }
-    }
-
-    pub fn on<D: Diagnostic, F: FnMut(&D) + 'a>(mut self, mut cb: F) -> DiagnosticSink<'a> {
-        let cb = move |diag: &dyn Diagnostic| match diag.downcast_ref::<D>() {
-            Some(d) => {
-                cb(d);
-                Ok(())
-            }
-            None => Err(()),
-        };
-        self.callbacks.push(Box::new(cb));
-        self
-    }
-
     pub fn push(&mut self, d: impl Diagnostic) {
         let d: &dyn Diagnostic = &d;
         self._push(d);
@@ -80,3 +63,29 @@ fn _push(&mut self, d: &dyn Diagnostic) {
         (self.default_callback)(d)
     }
 }
+
+pub struct DiagnosticSinkBuilder<'a> {
+    callbacks: Vec<Box<dyn FnMut(&dyn Diagnostic) -> Result<(), ()> + 'a>>,
+}
+
+impl<'a> DiagnosticSinkBuilder<'a> {
+    pub fn new() -> Self {
+        Self { callbacks: Vec::new() }
+    }
+
+    pub fn on<D: Diagnostic, F: FnMut(&D) + 'a>(mut self, mut cb: F) -> Self {
+        let cb = move |diag: &dyn Diagnostic| match diag.downcast_ref::<D>() {
+            Some(d) => {
+                cb(d);
+                Ok(())
+            }
+            None => Err(()),
+        };
+        self.callbacks.push(Box::new(cb));
+        self
+    }
+
+    pub fn build<F: FnMut(&dyn Diagnostic) + 'a>(self, default_callback: F) -> DiagnosticSink<'a> {
+        DiagnosticSink { callbacks: self.callbacks, default_callback: Box::new(default_callback) }
+    }
+}