language_reporting/
diagnostic.rs1use crate::{ReportingSpan, Severity};
2use serde_derive::{Serialize, Deserialize};
3
4#[derive(Copy, Clone, PartialEq, Debug, Serialize, Deserialize)]
6pub enum LabelStyle {
7 Primary,
9 Secondary,
11}
12
13#[derive(Clone, Debug, Serialize, Deserialize)]
15pub struct Label<Span: ReportingSpan> {
16 pub span: Span,
18 pub message: Option<String>,
20 pub style: LabelStyle,
22}
23
24impl<Span: ReportingSpan> Label<Span> {
25 pub fn new(span: Span, style: LabelStyle) -> Label<Span> {
26 Label {
27 span,
28 message: None,
29 style,
30 }
31 }
32
33 pub fn new_primary(span: Span) -> Label<Span> {
34 Label::new(span, LabelStyle::Primary)
35 }
36
37 pub fn new_secondary(span: Span) -> Label<Span> {
38 Label::new(span, LabelStyle::Secondary)
39 }
40
41 pub fn with_message<S: Into<String>>(mut self, message: S) -> Label<Span> {
42 self.message = Some(message.into());
43 self
44 }
45
46 pub fn message(&self) -> &Option<String> {
47 &self.message
48 }
49}
50
51#[derive(Clone, Debug, Deserialize, Serialize)]
53pub struct Diagnostic<Span: ReportingSpan> {
54 pub severity: Severity,
56 pub code: Option<String>,
58 pub message: String,
60 pub labels: Vec<Label<Span>>,
63}
64
65impl<Span: ReportingSpan> Diagnostic<Span> {
66 pub fn new<S: Into<String>>(severity: Severity, message: S) -> Diagnostic<Span> {
67 Diagnostic {
68 severity,
69 code: None,
70 message: message.into(),
71 labels: Vec::new(),
72 }
73 }
74
75 pub fn new_bug<S: Into<String>>(message: S) -> Diagnostic<Span> {
76 Diagnostic::new(Severity::Bug, message)
77 }
78
79 pub fn new_error<S: Into<String>>(message: S) -> Diagnostic<Span> {
80 Diagnostic::new(Severity::Error, message)
81 }
82
83 pub fn new_warning<S: Into<String>>(message: S) -> Diagnostic<Span> {
84 Diagnostic::new(Severity::Warning, message)
85 }
86
87 pub fn new_note<S: Into<String>>(message: S) -> Diagnostic<Span> {
88 Diagnostic::new(Severity::Note, message)
89 }
90
91 pub fn new_help<S: Into<String>>(message: S) -> Diagnostic<Span> {
92 Diagnostic::new(Severity::Help, message)
93 }
94
95 pub fn with_code<S: Into<String>>(mut self, code: S) -> Diagnostic<Span> {
96 self.code = Some(code.into());
97 self
98 }
99
100 pub fn with_label(mut self, label: Label<Span>) -> Diagnostic<Span> {
101 self.labels.push(label);
102 self
103 }
104
105 pub fn with_labels<Labels: IntoIterator<Item = Label<Span>>>(
106 mut self,
107 labels: Labels,
108 ) -> Diagnostic<Span> {
109 self.labels.extend(labels);
110 self
111 }
112}