erebus 0.1.7

A CLI message generation library
Documentation
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]
    /// Useful for storing a message in a Vec<Message<Id>>, even if the message has no file.
    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,
        }
    }
}