1 2 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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
//! display_list module stores the output model for the snippet.
//!
//! `DisplayList` is a central structure in the crate, which contains
//! the structured list of lines to be displayed.
//!
//! It is made of two types of lines: `Source` and `Raw`. All `Source` lines
//! are structured using four columns:
//!
//! ```text
//! /------------ (1) Line number column.
//! | /--------- (2) Line number column delimiter.
//! | | /------- (3) Inline marks column.
//! | | | /--- (4) Content column with the source and annotations for slices.
//! | | | |
//! =============================================================================
//! error[E0308]: mismatched types
//! --> src/format.rs:51:5
//! |
//! 151 | / fn test() -> String {
//! 152 | | return "test";
//! 153 | | }
//! | |___^ error: expected `String`, for `&str`.
//! |
//! ```
//!
//! The first two lines of the example above are `Raw` lines, while the rest
//! are `Source` lines.
//!
//! `DisplayList` does not store column alignment information, and those are
//! only calculated by the `DisplayListFormatter` using information such as
//! styling.
//!
//! The above snippet has been built out of the following structure:
//!
//! ```
//! use annotate_snippets::display_list::*;
//!
//! let dl = DisplayList {
//! body: vec![
//! DisplayLine::Raw(DisplayRawLine::Annotation {
//! annotation: Annotation {
//! annotation_type: DisplayAnnotationType::Error,
//! id: Some("E0308".to_string()),
//! label: vec![
//! DisplayTextFragment {
//! content: "mismatched types".to_string(),
//! style: DisplayTextStyle::Regular,
//! }
//! ]
//! },
//! source_aligned: false,
//! continuation: false,
//! }),
//! DisplayLine::Raw(DisplayRawLine::Origin {
//! path: "src/format.rs".to_string(),
//! pos: Some((51, 5)),
//! header_type: DisplayHeaderType::Initial,
//! }),
//! DisplayLine::Source {
//! lineno: Some(151),
//! inline_marks: vec![
//! DisplayMark {
//! mark_type: DisplayMarkType::AnnotationStart,
//! annotation_type: DisplayAnnotationType::Error,
//! }
//! ],
//! line: DisplaySourceLine::Content {
//! text: " fn test() -> String {".to_string(),
//! range: (0, 24)
//! }
//! },
//! DisplayLine::Source {
//! lineno: Some(152),
//! inline_marks: vec![
//! DisplayMark {
//! mark_type: DisplayMarkType::AnnotationThrough,
//! annotation_type: DisplayAnnotationType::Error,
//! }
//! ],
//! line: DisplaySourceLine::Content {
//! text: " return \"test\";".to_string(),
//! range: (25, 46)
//! }
//! },
//! DisplayLine::Source {
//! lineno: Some(153),
//! inline_marks: vec![
//! DisplayMark {
//! mark_type: DisplayMarkType::AnnotationThrough,
//! annotation_type: DisplayAnnotationType::Error,
//! }
//! ],
//! line: DisplaySourceLine::Content {
//! text: " }".to_string(),
//! range: (47, 51)
//! }
//! },
//! DisplayLine::Source {
//! lineno: None,
//! inline_marks: vec![],
//! line: DisplaySourceLine::Annotation {
//! annotation: Annotation {
//! annotation_type: DisplayAnnotationType::Error,
//! id: None,
//! label: vec![
//! DisplayTextFragment {
//! content: "expected `String`, for `&str`.".to_string(),
//! style: DisplayTextStyle::Regular,
//! }
//! ]
//! },
//! range: (3, 4),
//! annotation_type: DisplayAnnotationType::Error,
//! annotation_part: DisplayAnnotationPart::MultilineEnd,
//! }
//!
//! }
//! ]
//! };
//! ```
mod from_snippet;
mod structs;
pub use self::structs::*;