use crate::{
files::{FileId, NoFile},
label::Label,
note::Note,
severity::Severity,
};
use super::{Identifier, Message};
impl Message<NoFile> {
#[must_use]
pub const fn builder(text: String) -> MessageBuilder<NoFile> {
MessageBuilder::new(text)
}
}
impl<Id: FileId> Message<Id> {
#[must_use]
pub const fn builder_file(text: String) -> MessageBuilder<Id> {
MessageBuilder::new(text)
}
}
pub struct MessageBuilder<Id: FileId> {
text: String,
identifier: Option<Identifier>,
severity: Option<Severity>,
labels: Vec<Label<Id>>,
notes: Vec<Note>,
}
impl<Id: FileId> MessageBuilder<Id> {
pub const fn new(text: String) -> Self {
Self {
text,
identifier: None,
severity: None,
labels: Vec::new(),
notes: Vec::new(),
}
}
pub fn set_identifier(mut self, identifier: Identifier) -> Self {
self.identifier = Some(identifier);
self
}
pub const fn set_severity(mut self, severity: Severity) -> Self {
self.severity = Some(severity);
self
}
pub fn add_label(mut self, label: Label<Id>) -> Self {
self.labels.push(label);
self
}
pub fn with_labels(mut self, labels: Vec<Label<Id>>) -> Self {
self.labels.extend(labels);
self
}
pub fn add_note(mut self, note: Note) -> Self {
self.notes.push(note);
self
}
pub fn with_notes(mut self, notes: Vec<Note>) -> Self {
self.notes.extend(notes);
self
}
pub fn build(self) -> Message<Id> {
Message {
text: self.text,
identifier: self.identifier,
severity: self.severity,
labels: self.labels,
notes: self.notes,
}
}
}