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>
impl<S: Span> Report<'_, S>
sourcepub fn write<C: Cache<S::SourceId>, W: Write>(
&self,
cache: C,
w: W
) -> Result<()>
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§impl<S: Span> Report<'_, S>
impl<S: Span> Report<'_, S>
sourcepub fn build<Id: Into<<S::SourceId as ToOwned>::Owned>>(
kind: ReportKind<'_>,
src_id: Id,
offset: usize
) -> ReportBuilder<'_, S>
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?
More 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();
}sourcepub fn eprint<C: Cache<S::SourceId>>(&self, cache: C) -> Result<()>
pub fn eprint<C: Cache<S::SourceId>>(&self, cache: C) -> Result<()>
Write this diagnostic out to stderr.
sourcepub fn print<C: Cache<S::SourceId>>(&self, cache: C) -> Result<()>
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?
More 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§
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more