From b65872011cd3df64a6a0ddfaa2ed05d70d41cf60 Mon Sep 17 00:00:00 2001 From: Gavrilikhin Daniil Date: Sun, 7 May 2023 09:44:23 +0800 Subject: [PATCH] Add `and_label(s)` --- src/miette_diagnostic.rs | 53 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/miette_diagnostic.rs b/src/miette_diagnostic.rs index 25c6529..8d2060e 100644 --- a/src/miette_diagnostic.rs +++ b/src/miette_diagnostic.rs @@ -206,10 +206,61 @@ impl MietteDiagnostic { /// assert_eq!(diag.message, "Typos in 'hello world'"); /// assert_eq!(diag.labels, Some(labels)); /// ``` - pub fn with_labels(self, labels: Vec) -> Self { + pub fn with_labels(self, labels: impl IntoIterator) -> Self { + Self { + labels: Some(labels.into_iter().collect()), + ..self + } + } + + /// Return new diagnostic with new label added to the existing ones. + /// + /// # Examples + /// ``` + /// use miette::{Diagnostic, LabeledSpan, MietteDiagnostic}; + /// + /// let source = "helo wrld"; + /// + /// let label1 = LabeledSpan::at_offset(3, "add 'l'"); + /// let label2 = LabeledSpan::at_offset(6, "add 'r'"); + /// let diag = MietteDiagnostic::new("Typos in 'hello world'") + /// .and_label(label1.clone()) + /// .and_label(label2.clone()); + /// assert_eq!(diag.message, "Typos in 'hello world'"); + /// assert_eq!(diag.labels, Some(vec![label1, label2])); + /// ``` + pub fn and_label(self, label: impl Into) -> Self { + let mut labels = self.labels.unwrap_or_default(); + labels.push(label.into()); Self { labels: Some(labels), ..self } } + + /// Return new diagnostic with new labels added to the existing ones. + /// + /// # Examples + /// ``` + /// use miette::{Diagnostic, LabeledSpan, MietteDiagnostic}; + /// + /// let source = "helo wrld"; + /// + /// let label1 = LabeledSpan::at_offset(3, "add 'l'"); + /// let label2 = LabeledSpan::at_offset(6, "add 'r'"); + /// let label3 = LabeledSpan::at_offset(9, "add '!'"); + /// let diag = MietteDiagnostic::new("Typos in 'hello world!'") + /// .and_label(label1.clone()) + /// .and_labels([label2.clone(), label3.clone()]); + /// assert_eq!(diag.message, "Typos in 'hello world!'"); + /// assert_eq!(diag.labels, Some(vec![label1, label2, label3])); + /// ``` + pub fn and_labels(self, labels: impl IntoIterator) -> Self { + let mut all_labels = self.labels.unwrap_or_default(); + all_labels.extend(labels.into_iter()); + Self { + labels: Some(all_labels), + ..self + } + } }