Skip to main content

prettyprint/
lib.rs

1// `error_chain!` can recurse deeply
2#![recursion_limit = "1024"]
3
4#[macro_use]
5extern crate derive_builder;
6
7#[macro_use]
8extern crate error_chain;
9
10#[macro_use]
11extern crate clap;
12
13#[macro_use]
14extern crate lazy_static;
15
16extern crate ansi_term;
17extern crate atty;
18extern crate console;
19extern crate content_inspector;
20extern crate directories;
21extern crate encoding;
22extern crate shell_words;
23extern crate syntect;
24
25mod assets;
26mod builder;
27mod decorations;
28mod dirs;
29mod inputfile;
30mod line_range;
31mod output;
32mod preprocessor;
33mod printer;
34mod style;
35mod syntax_mapping;
36mod terminal;
37
38pub use crate::builder::{PagingMode, PrettyPrint, PrettyPrinter};
39
40#[allow(deprecated)] // remove it after error-chain/issues/254 resolved 🤗
41mod errors {
42    error_chain! {
43        foreign_links {
44            Clap(::clap::Error);
45            Io(::std::io::Error);
46            SyntectError(::syntect::LoadingError);
47            ParseIntError(::std::num::ParseIntError);
48        }
49    }
50}
51
52pub use errors::Error as PrettyPrintError;
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    /// Pretty prints its own code
59    #[test]
60    fn it_works() {
61        let printer = PrettyPrinter::default().build().unwrap();
62        printer.file("fixtures/fib.rs").unwrap();
63    }
64
65    /// Pretty prints its own code with some more formatting shenanigans
66    #[test]
67    fn it_works_with_output_opts() {
68        let printer = PrettyPrinter::default()
69            .line_numbers(true)
70            .header(true)
71            .grid(true)
72            .paging_mode(PagingMode::Never)
73            .language("ruby")
74            .build()
75            .unwrap();
76
77        let example = r#"
78        def fib(n)        
79            return 1 if n <= 1
80            fib(n-1) + fib(n-2)
81        end
82        "#;
83        printer.string_with_header(example, "example.rb").unwrap();
84    }
85
86    #[test]
87    fn it_works_inside_loop() {
88        let printer = PrettyPrinter::default()
89            .language("markdown")
90            .build()
91            .unwrap();
92        for i in 0..7 {
93            printer.string(format!("## Heading {}", i)).unwrap();
94        }
95    }
96
97    #[test]
98    fn it_works_inside_closure() {
99        let printer = PrettyPrinter::default()
100            .language("markdown")
101            .build()
102            .unwrap();
103        let print_heading = |string| printer.string(format!("## {}", string)).expect("Printed");
104        print_heading("Thankyou for making a crate version of `bat` 🥺");
105    }
106
107    #[test]
108    fn it_can_print_multiple_times() {
109        let printer = PrettyPrinter::default().language("rust").build().unwrap();
110        printer.string("").unwrap();
111
112        printer.string("let example = Ok(());").unwrap();
113        printer
114            .string_with_header("let example = Ok(());", "example.rs")
115            .unwrap();
116        printer.file("fixtures/fib.rs").unwrap();
117    }
118
119    #[test]
120    fn it_can_load_syntaxset() {
121        let buffer: Vec<u8> = include_bytes!("../assets/syntaxes.bin").to_vec();
122        let printer = PrettyPrinter::default()
123            .language("rust")
124            .load_syntax(buffer)
125            .build()
126            .unwrap();
127
128        printer.file("fixtures/fib.rs").unwrap();
129    }
130
131    #[test]
132    fn it_can_load_themeset() {
133        let buffer = include_bytes!("../assets/themes.bin").to_vec();
134        let printer = PrettyPrinter::default()
135            .language("rust")
136            .load_theme(buffer)
137            .build()
138            .unwrap();
139
140        printer.file("fixtures/fib.rs").unwrap();
141    }
142
143    /// Show available syntax highlighting themes
144    #[test]
145    fn show_themes() {
146        let printer = PrettyPrinter::default().build().unwrap();
147        assert!(printer.get_themes().len() > 0);
148        println!("{:?}", printer.get_themes().keys());
149    }
150
151}