2020-04-21 17:08:19 +00:00
|
|
|
use std::ffi::OsStr;
|
|
|
|
|
|
|
|
use crate::{
|
2020-04-21 18:21:02 +00:00
|
|
|
config::{
|
2020-04-21 19:19:06 +00:00
|
|
|
Config, HighlightedLineRanges, Input, LineRanges, OrdinaryFile, StyleComponents,
|
2020-04-21 18:21:02 +00:00
|
|
|
SyntaxMapping, WrappingMode,
|
|
|
|
},
|
2020-04-21 17:08:19 +00:00
|
|
|
errors::Result,
|
|
|
|
Controller, HighlightingAssets,
|
|
|
|
};
|
|
|
|
|
2020-04-21 18:21:02 +00:00
|
|
|
#[cfg(feature = "paging")]
|
|
|
|
use crate::config::PagingMode;
|
|
|
|
|
2020-04-21 17:08:19 +00:00
|
|
|
pub struct PrettyPrinter<'a> {
|
2020-04-21 19:19:06 +00:00
|
|
|
inputs: Vec<Input>,
|
2020-04-21 17:08:19 +00:00
|
|
|
config: Config<'a>,
|
|
|
|
assets: HighlightingAssets,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> PrettyPrinter<'a> {
|
|
|
|
pub fn new() -> Self {
|
|
|
|
let mut config = Config::default();
|
|
|
|
|
|
|
|
config.colored_output = true;
|
|
|
|
config.true_color = true;
|
|
|
|
|
|
|
|
PrettyPrinter {
|
2020-04-21 19:14:44 +00:00
|
|
|
inputs: vec![],
|
2020-04-21 17:08:19 +00:00
|
|
|
config,
|
|
|
|
assets: HighlightingAssets::from_binary(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-21 18:06:09 +00:00
|
|
|
/// Add a file which should be pretty-printed
|
|
|
|
pub fn file(&mut self, path: &OsStr) -> &mut Self {
|
2020-04-21 19:14:44 +00:00
|
|
|
self.inputs
|
2020-04-21 19:19:06 +00:00
|
|
|
.push(Input::Ordinary(OrdinaryFile::from_path(path)));
|
2020-04-21 17:08:19 +00:00
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2020-04-21 18:06:09 +00:00
|
|
|
/// Add multiple files which should be pretty-printed
|
|
|
|
pub fn files<I, P>(&mut self, paths: I) -> &mut Self
|
|
|
|
where
|
|
|
|
I: IntoIterator<Item = P>,
|
|
|
|
P: AsRef<OsStr>,
|
|
|
|
{
|
|
|
|
for path in paths {
|
2020-04-21 19:14:44 +00:00
|
|
|
self.inputs
|
2020-04-21 19:19:06 +00:00
|
|
|
.push(Input::Ordinary(OrdinaryFile::from_path(path.as_ref())));
|
2020-04-21 18:06:09 +00:00
|
|
|
}
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2020-04-21 18:21:02 +00:00
|
|
|
pub fn language(&mut self, language: &'a str) -> &mut Self {
|
|
|
|
self.config.language = Some(language);
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2020-04-21 18:06:09 +00:00
|
|
|
/// The character width of the terminal (default: unlimited)
|
|
|
|
pub fn term_width(&mut self, width: usize) -> &mut Self {
|
|
|
|
self.config.term_width = width;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
/// The width of tab characters (default: None - do not turn tabs to spaces)
|
|
|
|
pub fn tab_width(&mut self, tab_width: Option<usize>) -> &mut Self {
|
|
|
|
self.config.tab_width = tab_width.unwrap_or(0);
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2020-04-21 17:08:19 +00:00
|
|
|
/// Whether or not the output should be colorized (default: true)
|
|
|
|
pub fn colored_output(&mut self, yes: bool) -> &mut Self {
|
|
|
|
self.config.colored_output = yes;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2020-04-21 18:06:09 +00:00
|
|
|
/// Whether or not to output 24bit colors (default: true)
|
|
|
|
pub fn true_color(&mut self, yes: bool) -> &mut Self {
|
|
|
|
self.config.true_color = yes;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Configure style elements (grid, line numbers, ...)
|
|
|
|
pub fn style_components(&mut self, components: StyleComponents) -> &mut Self {
|
|
|
|
self.config.style_components = components;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Text wrapping mode (default: do not wrap)
|
2020-04-21 18:21:02 +00:00
|
|
|
pub fn wrapping_mode(&mut self, mode: WrappingMode) -> &mut Self {
|
|
|
|
self.config.wrapping_mode = mode;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Whether or not to use ANSI italics (default: off)
|
|
|
|
pub fn use_italics(&mut self, yes: bool) -> &mut Self {
|
|
|
|
self.config.use_italic_text = yes;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
/// If and how to use a pager (default: no paging)
|
|
|
|
#[cfg(feature = "paging")]
|
|
|
|
pub fn paging_mode(&mut self, mode: PagingMode) -> &mut Self {
|
|
|
|
self.config.paging_mode = mode;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Specify the command to start the pager (default: use "less")
|
|
|
|
#[cfg(feature = "paging")]
|
|
|
|
pub fn pager(&mut self, cmd: &'a str) -> &mut Self {
|
|
|
|
self.config.pager = Some(cmd);
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Specify the lines that should be printed (default: all)
|
|
|
|
pub fn line_ranges(&mut self, ranges: LineRanges) -> &mut Self {
|
|
|
|
self.config.line_ranges = ranges;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Specify which lines should be highlighted (default: none)
|
|
|
|
pub fn highlighted_lines(&mut self, ranges: HighlightedLineRanges) -> &mut Self {
|
|
|
|
self.config.highlighted_lines = ranges;
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Specify the highlighting theme
|
|
|
|
pub fn theme(&mut self, theme: impl AsRef<str>) -> &mut Self {
|
|
|
|
self.config.theme = theme.as_ref().to_owned();
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Specify custom file extension / file name to syntax mappings
|
|
|
|
pub fn syntax_mapping(&mut self, mapping: SyntaxMapping<'a>) -> &mut Self {
|
|
|
|
self.config.syntax_mapping = mapping;
|
2020-04-21 18:06:09 +00:00
|
|
|
self
|
|
|
|
}
|
|
|
|
|
2020-04-21 19:14:44 +00:00
|
|
|
pub fn run(self) -> Result<bool> {
|
2020-04-21 17:08:19 +00:00
|
|
|
let controller = Controller::new(&self.config, &self.assets);
|
2020-04-21 19:14:44 +00:00
|
|
|
controller.run(self.inputs)
|
2020-04-21 17:08:19 +00:00
|
|
|
}
|
|
|
|
}
|