erebus 0.1.7

A CLI message generation library
Documentation
use erebus::{Files, Identifier, Label, Message, NoFile, Style};
use yansi::Paint;

static MESSAGES: &[&str] = &[
    "This is a test message.",
    "This is a test message, but it has more text so that it is longer, and will likely cause a text break on most terminals. This has been a test message.",
];

pub struct TestFiles;
impl<'a> Files<'a> for TestFiles {
    type FileId = usize;
    type Content = &'a str;
    fn name(&self, id: &'a Self::FileId) -> Option<&'a str> {
        match id {
            0 => Some("hello.rs"),
            1 => Some("stringtable.xml"),
            _ => None,
        }
    }
    fn content(&self, id: &'a Self::FileId) -> Option<Self::Content> {
        match id {
            0 => Some(include_str!("../tests/test_files/hello.rs")),
            1 => Some(include_str!("../tests/test_files/stringtable.xml")),
            _ => None,
        }
    }
}

#[test]
fn only_message() {
    for message in MESSAGES {
        let message = Message::builder((*message).to_string())
            .build()
            .render(&NoFile, &Style::default());
        insta::assert_snapshot!(message);
    }
}

#[test]
fn only_severity() {
    for message in MESSAGES {
        let message = Message::builder((*message).to_string())
            .set_severity(erebus::Severity::Error)
            .build()
            .render(&NoFile, &Style::default());
        insta::assert_snapshot!(message);
    }
}

#[test]
fn only_identifier() {
    for message in MESSAGES {
        let message = Message::builder((*message).to_string())
            .set_identifier(Identifier::simple("test".to_string()))
            .build()
            .render(&NoFile, &Style::default());
        insta::assert_snapshot!(message);
    }
}

#[test]
fn only_identifier_url() {
    for message in MESSAGES {
        let message = Message::builder((*message).to_string())
            .set_identifier(Identifier::hyperlink(
                "test".to_string(),
                "https://github.com/brettmayson/erebus".to_string(),
            ))
            .build()
            .render(&NoFile, &Style::default());
        insta::assert_snapshot!(message);
    }
}

#[test]
fn only_severity_identifier() {
    for message in MESSAGES {
        let message = Message::builder((*message).to_string())
            .set_severity(erebus::Severity::Warning)
            .set_identifier(Identifier::simple("test".to_string()))
            .build()
            .render(&NoFile, &Style::default());
        insta::assert_snapshot!(message);
    }
}

#[test]
fn simple_label() {
    let message = Message::builder_file("This is a test message.".to_string())
        .set_severity(erebus::Severity::Error)
        .set_identifier(Identifier::simple("test".to_string()))
        .add_label(
            Label::builder(0, 15..21)
                .set_color(erebus::Color::Green)
                .set_content("Parameter Type".to_string())
                .build(),
        )
        .build()
        .render(&TestFiles, &Style::default());
    insta::assert_snapshot!(message);
}

#[test]
fn simple_label_two() {
    let message = Message::builder_file("This is a test message.".to_string())
        .set_severity(erebus::Severity::Error)
        .set_identifier(Identifier::simple("test".to_string()))
        .add_label(
            Label::builder(0, 15..21)
                .set_color(erebus::Color::Green)
                .set_content("Param".to_string())
                .build(),
        )
        .add_label(
            Label::builder(0, 26..32)
                .set_color(erebus::Color::Magenta)
                .set_content("Return".to_string())
                .build(),
        )
        .build()
        .render(&TestFiles, &Style::default());
    insta::assert_snapshot!(message);
}

#[test]
fn nested_label_color() {
    let message = Message::builder_file("This is a test message.".to_string())
        .set_severity(erebus::Severity::Error)
        .set_identifier(Identifier::simple("test".to_string()))
        .add_label(
            Label::builder(0, 15..21)
                .set_color(erebus::Color::Green)
                .set_content("Param".to_string())
                .build(),
        )
        .add_label(
            Label::builder(0, 26..32)
                .set_color(erebus::Color::Magenta)
                .set_content("Return".to_string())
                .build(),
        )
        .add_label(
            Label::builder(0, 17..18)
                .set_color(erebus::Color::Yellow)
                .build(),
        )
        .build()
        .render(&TestFiles, &Style::default());
    insta::assert_snapshot!(message);
}

#[test]
fn nested_label_message() {
    let message = Message::builder_file("This is a test message.".to_string())
        .set_severity(erebus::Severity::Error)
        .set_identifier(Identifier::simple("test".to_string()))
        .add_label(
            Label::builder(0, 15..21)
                .set_color(erebus::Color::Green)
                .set_content("Param".to_string())
                .build(),
        )
        .add_label(
            Label::builder(0, 26..32)
                .set_color(erebus::Color::Magenta)
                .set_content("Return".to_string())
                .build(),
        )
        .add_label(
            Label::builder(0, 17..18)
                .set_color(erebus::Color::Yellow)
                .set_content("R".to_string())
                .build(),
        )
        .build()
        .render(&TestFiles, &Style::default());
    insta::assert_snapshot!(message);
}

#[test]
fn simple_label_two_lines() {
    let message = Message::builder_file("This is a test message.".to_string())
        .set_severity(erebus::Severity::Error)
        .set_identifier(Identifier::simple("test".to_string()))
        .add_label(
            Label::builder(0, 15..21)
                .set_color(erebus::Color::Green)
                .set_content("Parameter Type".to_string())
                .build(),
        )
        .add_label(
            Label::builder(0, 49..54)
                .set_color(erebus::Color::Yellow)
                .set_content("oh hi".to_string())
                .build(),
        )
        .build()
        .render(&TestFiles, &Style::default());
    insta::assert_snapshot!(message);
}

#[test]
fn multi_file() {
    let message = Message::builder_file("This is a test message.".to_string())
        .set_severity(erebus::Severity::Error)
        .set_identifier(Identifier::simple("test".to_string()))
        .add_label(
            Label::builder(0, 15..21)
                .set_color(erebus::Color::Green)
                .set_content("Parameter Type".to_string())
                .build(),
        )
        .add_label(
            Label::builder(1, 480..483)
                .set_color(erebus::Color::Yellow)
                .set_content(format!("Korean for {}", "building".yellow()))
                .build(),
        )
        .build()
        .render(&TestFiles, &Style::default());
    insta::assert_snapshot!(message);
}

#[test]
fn only_note() {
    for message in MESSAGES {
        let message = Message::builder_file("This is a test message.".to_string())
            .set_severity(erebus::Severity::Error)
            .set_identifier(Identifier::simple("test".to_string()))
            .add_note(
                erebus::Note::builder(
                    (*message).to_string(),
                    Identifier::simple("note".to_string()),
                )
                .build(),
            )
            .build()
            .render(&NoFile, &Style::default());
        insta::assert_snapshot!(message);
    }
}