Struct ariadne::Report

source ·
pub struct Report<'a, S: Span = Range<usize>> { /* private fields */ }
Expand description

A type representing a diagnostic that is ready to be written to output.

Implementations§

source§

impl<S: Span> Report<'_, S>

source

pub fn write<C: Cache<S::SourceId>, W: Write>( &self, cache: C, w: W ) -> Result<()>

Write this diagnostic to an implementor of Write.

If using the concolor feature, this method assumes that the output is ultimately going to be printed to stderr. If you are printing to stdout, use the write_for_stdout method instead.

If you wish to write to stderr or stdout, you can do so via Report::eprint or Report::print respectively.

source

pub fn write_for_stdout<C: Cache<S::SourceId>, W: Write>( &self, cache: C, w: W ) -> Result<()>

Write this diagnostic to an implementor of Write, assuming that the output is ultimately going to be printed to stdout.

source§

impl<S: Span> Report<'_, S>

source

pub fn build<Id: Into<<S::SourceId as ToOwned>::Owned>>( kind: ReportKind<'_>, src_id: Id, offset: usize ) -> ReportBuilder<'_, S>

Begin building a new Report.

Examples found in repository?
examples/simple.rs (line 4)
3
4
5
6
7
8
9
10
11
fn main() {
    Report::build(ReportKind::Error, (), 34)
        .with_message("Incompatible types")
        .with_label(Label::new(32..33).with_message("This is of type Nat"))
        .with_label(Label::new(42..45).with_message("This is of type Str"))
        .finish()
        .print(Source::from(include_str!("sample.tao")))
        .unwrap();
}
More examples
Hide additional examples
examples/multifile.rs (line 11)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
fn main() {
    let mut colors = ColorGenerator::new();

    // Generate some colours for each of our elements
    let a = colors.next();
    let b = colors.next();
    let c = colors.next();

    Report::build(ReportKind::Error, "b.tao", 10)
        .with_code(3)
        .with_message(format!("Cannot add types Nat and Str"))
        .with_label(Label::new(("b.tao", 10..14))
            .with_message(format!("This is of type {}", "Nat".fg(a)))
            .with_color(a))
        .with_label(Label::new(("b.tao", 17..20))
            .with_message(format!("This is of type {}", "Str".fg(b)))
            .with_color(b))
        .with_label(Label::new(("b.tao", 15..16))
            .with_message(format!(" {} and {} undergo addition here", "Nat".fg(a), "Str".fg(b)))
            .with_color(c)
            .with_order(10))
        .with_label(Label::new(("a.tao", 4..8))
            .with_message(format!("Original definition of {} is here", "five".fg(a)))
            .with_color(a))
        .with_note(format!("{} is a number and can only be added to other numbers", "Nat".fg(a)))
        .finish()
        .print(sources(vec![
            ("a.tao", include_str!("a.tao")),
            ("b.tao", include_str!("b.tao")),
        ]))
        .unwrap();
}
examples/multiline.rs (line 12)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
fn main() {
    let mut colors = ColorGenerator::new();

    // Generate & choose some colours for each of our elements
    let a = colors.next();
    let b = colors.next();
    let out = Color::Fixed(81);
    let out2= colors.next();

    Report::build(ReportKind::Error, "sample.tao", 12)
        .with_code(3)
        .with_message(format!("Incompatible types"))
        .with_label(Label::new(("sample.tao", 32..33))
            .with_message(format!("This is of type {}", "Nat".fg(a)))
            .with_color(a))
        .with_label(Label::new(("sample.tao", 42..45))
            .with_message(format!("This is of type {}", "Str".fg(b)))
            .with_color(b))
        .with_label(Label::new(("sample.tao", 11..48))
            .with_message(format!(
                "The values are outputs of this {} expression",
                "match".fg(out),
            ))
            .with_color(out))
        .with_label(Label::new(("sample.tao", 0..48))
            .with_message(format!(
                "The {} has a problem",
                "definition".fg(out2),
            ))
            .with_color(out2))
        .with_label(Label::new(("sample.tao", 50..76))
            .with_message(format!(
                "Usage of {} here",
                "definition".fg(out2),
            ))
            .with_color(out2))
        .with_note(format!("Outputs of {} expressions must coerce to the same type", "match".fg(out)))
        .finish()
        .print(("sample.tao", Source::from(include_str!("sample.tao"))))
        .unwrap();
}
examples/stresstest.rs (line 6)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
fn main() {
    let mut colors = ColorGenerator::new();

    Report::build(ReportKind::Error, "stresstest.tao", 13)
        .with_code(3)
        .with_message(format!("Incompatible types"))
        .with_label(Label::new(("stresstest.tao", 0..1)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 1..2)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 2..3)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 3..4)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 4..5)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 5..6)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 6..7)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 7..8)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 8..9)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 9..10)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 10..11)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 11..12)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 12..13)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 13..14)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 14..15)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 15..16)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 16..17)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 17..18)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 18..19)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 19..20)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 20..21)).with_message("Color").with_color(colors.next()))

        .with_label(Label::new(("stresstest.tao", 18..19)).with_message("This is of type Nat").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 13..16)).with_message("This is of type Str").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 40..41)).with_message("This is of type Nat").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 43..47)).with_message("This is of type Bool").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 49..51)).with_message("This is of type ()").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 53..55)).with_message("This is of type [_]").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 25..78)).with_message("This is of type Str").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 81..124)).with_message("This is of type Nat").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 100..126)).with_message("This is an inner multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 106..120)).with_message("This is another inner multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 108..122)).with_message("This is *really* nested multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 110..111)).with_message("This is an inline within the nesting!").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 111..112)).with_message("And another!").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 103..123)).with_message("This is *really* nested multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 105..125)).with_message("This is *really* nested multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 112..116)).with_message("This is *really* nested multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 26..100)).with_message("Hahaha!").with_color(Color::Fixed(75)))
        .with_label(Label::new(("stresstest.tao", 85..110)).with_message("Oh god, no more 1").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 84..114)).with_message("Oh god, no more 2").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 89..113)).with_message("Oh god, no more 3").with_color(colors.next()))
        .with_config(Config::default()
            .with_cross_gap(false)
            .with_compact(true)
            .with_underlines(true)
            .with_tab_width(4))
        .finish()
        .print(("stresstest.tao", Source::from(include_str!("stresstest.tao"))))
        .unwrap();
}
source

pub fn eprint<C: Cache<S::SourceId>>(&self, cache: C) -> Result<()>

Write this diagnostic out to stderr.

source

pub fn print<C: Cache<S::SourceId>>(&self, cache: C) -> Result<()>

Write this diagnostic out to stdout.

In most cases, Report::eprint is the ‘more correct’ function to use.

Examples found in repository?
examples/simple.rs (line 9)
3
4
5
6
7
8
9
10
11
fn main() {
    Report::build(ReportKind::Error, (), 34)
        .with_message("Incompatible types")
        .with_label(Label::new(32..33).with_message("This is of type Nat"))
        .with_label(Label::new(42..45).with_message("This is of type Str"))
        .finish()
        .print(Source::from(include_str!("sample.tao")))
        .unwrap();
}
More examples
Hide additional examples
examples/multifile.rs (lines 29-32)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
fn main() {
    let mut colors = ColorGenerator::new();

    // Generate some colours for each of our elements
    let a = colors.next();
    let b = colors.next();
    let c = colors.next();

    Report::build(ReportKind::Error, "b.tao", 10)
        .with_code(3)
        .with_message(format!("Cannot add types Nat and Str"))
        .with_label(Label::new(("b.tao", 10..14))
            .with_message(format!("This is of type {}", "Nat".fg(a)))
            .with_color(a))
        .with_label(Label::new(("b.tao", 17..20))
            .with_message(format!("This is of type {}", "Str".fg(b)))
            .with_color(b))
        .with_label(Label::new(("b.tao", 15..16))
            .with_message(format!(" {} and {} undergo addition here", "Nat".fg(a), "Str".fg(b)))
            .with_color(c)
            .with_order(10))
        .with_label(Label::new(("a.tao", 4..8))
            .with_message(format!("Original definition of {} is here", "five".fg(a)))
            .with_color(a))
        .with_note(format!("{} is a number and can only be added to other numbers", "Nat".fg(a)))
        .finish()
        .print(sources(vec![
            ("a.tao", include_str!("a.tao")),
            ("b.tao", include_str!("b.tao")),
        ]))
        .unwrap();
}
examples/multiline.rs (line 41)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
fn main() {
    let mut colors = ColorGenerator::new();

    // Generate & choose some colours for each of our elements
    let a = colors.next();
    let b = colors.next();
    let out = Color::Fixed(81);
    let out2= colors.next();

    Report::build(ReportKind::Error, "sample.tao", 12)
        .with_code(3)
        .with_message(format!("Incompatible types"))
        .with_label(Label::new(("sample.tao", 32..33))
            .with_message(format!("This is of type {}", "Nat".fg(a)))
            .with_color(a))
        .with_label(Label::new(("sample.tao", 42..45))
            .with_message(format!("This is of type {}", "Str".fg(b)))
            .with_color(b))
        .with_label(Label::new(("sample.tao", 11..48))
            .with_message(format!(
                "The values are outputs of this {} expression",
                "match".fg(out),
            ))
            .with_color(out))
        .with_label(Label::new(("sample.tao", 0..48))
            .with_message(format!(
                "The {} has a problem",
                "definition".fg(out2),
            ))
            .with_color(out2))
        .with_label(Label::new(("sample.tao", 50..76))
            .with_message(format!(
                "Usage of {} here",
                "definition".fg(out2),
            ))
            .with_color(out2))
        .with_note(format!("Outputs of {} expressions must coerce to the same type", "match".fg(out)))
        .finish()
        .print(("sample.tao", Source::from(include_str!("sample.tao"))))
        .unwrap();
}
examples/stresstest.rs (line 57)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
fn main() {
    let mut colors = ColorGenerator::new();

    Report::build(ReportKind::Error, "stresstest.tao", 13)
        .with_code(3)
        .with_message(format!("Incompatible types"))
        .with_label(Label::new(("stresstest.tao", 0..1)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 1..2)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 2..3)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 3..4)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 4..5)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 5..6)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 6..7)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 7..8)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 8..9)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 9..10)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 10..11)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 11..12)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 12..13)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 13..14)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 14..15)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 15..16)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 16..17)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 17..18)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 18..19)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 19..20)).with_message("Color").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 20..21)).with_message("Color").with_color(colors.next()))

        .with_label(Label::new(("stresstest.tao", 18..19)).with_message("This is of type Nat").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 13..16)).with_message("This is of type Str").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 40..41)).with_message("This is of type Nat").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 43..47)).with_message("This is of type Bool").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 49..51)).with_message("This is of type ()").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 53..55)).with_message("This is of type [_]").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 25..78)).with_message("This is of type Str").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 81..124)).with_message("This is of type Nat").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 100..126)).with_message("This is an inner multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 106..120)).with_message("This is another inner multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 108..122)).with_message("This is *really* nested multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 110..111)).with_message("This is an inline within the nesting!").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 111..112)).with_message("And another!").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 103..123)).with_message("This is *really* nested multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 105..125)).with_message("This is *really* nested multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 112..116)).with_message("This is *really* nested multi-line").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 26..100)).with_message("Hahaha!").with_color(Color::Fixed(75)))
        .with_label(Label::new(("stresstest.tao", 85..110)).with_message("Oh god, no more 1").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 84..114)).with_message("Oh god, no more 2").with_color(colors.next()))
        .with_label(Label::new(("stresstest.tao", 89..113)).with_message("Oh god, no more 3").with_color(colors.next()))
        .with_config(Config::default()
            .with_cross_gap(false)
            .with_compact(true)
            .with_underlines(true)
            .with_tab_width(4))
        .finish()
        .print(("stresstest.tao", Source::from(include_str!("stresstest.tao"))))
        .unwrap();
}

Trait Implementations§

source§

impl<'a, S: Span> Debug for Report<'a, S>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a, S> RefUnwindSafe for Report<'a, S>where S: RefUnwindSafe, <<S as Span>::SourceId as ToOwned>::Owned: RefUnwindSafe,

§

impl<'a, S> Send for Report<'a, S>where S: Send, <<S as Span>::SourceId as ToOwned>::Owned: Send,

§

impl<'a, S> Sync for Report<'a, S>where S: Sync, <<S as Span>::SourceId as ToOwned>::Owned: Sync,

§

impl<'a, S> Unpin for Report<'a, S>where S: Unpin, <<S as Span>::SourceId as ToOwned>::Owned: Unpin,

§

impl<'a, S> UnwindSafe for Report<'a, S>where S: UnwindSafe, <<S as Span>::SourceId as ToOwned>::Owned: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.