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::*;