diff --git a/examples/simple.rs b/examples/simple.rs index 16e0e71f..c3fcd0b9 100644 --- a/examples/simple.rs +++ b/examples/simple.rs @@ -29,7 +29,7 @@ fn main() { theme: "1337".into(), ..Default::default() }; - let assets = HighlightingAssets::new(); + let assets = HighlightingAssets::from_binary(); Controller::new(&config, &assets).run().expect("no errors"); } diff --git a/src/assets.rs b/src/assets.rs index b757e4af..312b14e8 100644 --- a/src/assets.rs +++ b/src/assets.rs @@ -1,15 +1,12 @@ -use std::borrow::Cow; use std::collections::BTreeMap; use std::fs::{self, File}; use std::io::BufReader; -use std::path::{Path, PathBuf}; +use std::path::Path; use syntect::dumps::{dump_to_file, from_binary, from_reader}; use syntect::highlighting::{Theme, ThemeSet}; use syntect::parsing::{SyntaxReference, SyntaxSet, SyntaxSetBuilder}; -use crate::dirs::PROJECT_DIRS; - use crate::errors::*; use crate::inputfile::{InputFile, InputFileReader}; use crate::syntax_mapping::SyntaxMapping; @@ -23,13 +20,7 @@ pub struct HighlightingAssets { } impl HighlightingAssets { - pub fn new() -> Self { - Self::from_cache().unwrap_or_else(|_| Self::from_binary()) - } - - pub fn from_files(dir: Option<&Path>, start_empty: bool) -> Result { - let source_dir = dir.unwrap_or_else(|| PROJECT_DIRS.config_dir()); - + pub fn from_files(source_dir: &Path, start_empty: bool) -> Result { let mut theme_set = if start_empty { ThemeSet { themes: BTreeMap::new(), @@ -72,12 +63,11 @@ impl HighlightingAssets { }) } - fn from_cache() -> Result { - let theme_set_path = theme_set_path(); - let syntax_set_file = File::open(&syntax_set_path()).chain_err(|| { + pub fn from_cache(theme_set_path: &Path, syntax_set_path: &Path) -> Result { + let syntax_set_file = File::open(syntax_set_path).chain_err(|| { format!( "Could not load cached syntax set '{}'", - syntax_set_path().to_string_lossy() + syntax_set_path.to_string_lossy() ) })?; let syntax_set: SyntaxSet = from_reader(BufReader::new(syntax_set_file)) @@ -106,7 +96,7 @@ impl HighlightingAssets { from_binary(include_bytes!("../assets/themes.bin")) } - fn from_binary() -> Self { + pub fn from_binary() -> Self { let syntax_set = Self::get_integrated_syntaxset(); let theme_set = Self::get_integrated_themeset(); @@ -116,8 +106,7 @@ impl HighlightingAssets { } } - pub fn save(&self, dir: Option<&Path>) -> Result<()> { - let target_dir = dir.unwrap_or_else(|| PROJECT_DIRS.cache_dir()); + pub fn save(&self, target_dir: &Path) -> Result<()> { let _ = fs::create_dir_all(target_dir); let theme_set_path = target_dir.join("themes.bin"); let syntax_set_path = target_dir.join("syntaxes.bin"); @@ -203,30 +192,4 @@ impl HighlightingAssets { syntax.unwrap_or_else(|| self.syntax_set.find_syntax_plain_text()) } -} - -fn theme_set_path() -> PathBuf { - PROJECT_DIRS.cache_dir().join("themes.bin") -} - -fn syntax_set_path() -> PathBuf { - PROJECT_DIRS.cache_dir().join("syntaxes.bin") -} - -pub fn config_dir() -> Cow<'static, str> { - PROJECT_DIRS.config_dir().to_string_lossy() -} - -pub fn cache_dir() -> Cow<'static, str> { - PROJECT_DIRS.cache_dir().to_string_lossy() -} - -pub fn clear_assets() { - print!("Clearing theme set cache ... "); - fs::remove_file(theme_set_path()).ok(); - println!("okay"); - - print!("Clearing syntax set cache ... "); - fs::remove_file(syntax_set_path()).ok(); - println!("okay"); -} +} \ No newline at end of file diff --git a/src/bin/bat/assets.rs b/src/bin/bat/assets.rs new file mode 100644 index 00000000..45060c43 --- /dev/null +++ b/src/bin/bat/assets.rs @@ -0,0 +1,37 @@ +use std::borrow::Cow; +use std::fs; +use std::path::PathBuf; + +use crate::directories::PROJECT_DIRS; + +use bat::assets::HighlightingAssets; + +fn theme_set_path() -> PathBuf { + PROJECT_DIRS.cache_dir().join("themes.bin") +} + +fn syntax_set_path() -> PathBuf { + PROJECT_DIRS.cache_dir().join("syntaxes.bin") +} + +pub fn config_dir() -> Cow<'static, str> { + PROJECT_DIRS.config_dir().to_string_lossy() +} + +pub fn cache_dir() -> Cow<'static, str> { + PROJECT_DIRS.cache_dir().to_string_lossy() +} + +pub fn clear_assets() { + print!("Clearing theme set cache ... "); + fs::remove_file(theme_set_path()).ok(); + println!("okay"); + + print!("Clearing syntax set cache ... "); + fs::remove_file(syntax_set_path()).ok(); + println!("okay"); +} + +pub fn assets_from_cache_or_binary() -> HighlightingAssets { + HighlightingAssets::from_cache(&theme_set_path(), &syntax_set_path()).unwrap_or(HighlightingAssets::from_binary()) +} diff --git a/src/bin/bat/config.rs b/src/bin/bat/config.rs index 95f76559..b8854844 100644 --- a/src/bin/bat/config.rs +++ b/src/bin/bat/config.rs @@ -5,7 +5,7 @@ use std::path::PathBuf; use shell_words; -use bat::dirs::PROJECT_DIRS; +use crate::directories::PROJECT_DIRS; pub fn config_file() -> PathBuf { env::var("BAT_CONFIG_PATH") diff --git a/src/dirs.rs b/src/bin/bat/directories.rs similarity index 86% rename from src/dirs.rs rename to src/bin/bat/directories.rs index 575b6ba9..e57a58c0 100644 --- a/src/dirs.rs +++ b/src/bin/bat/directories.rs @@ -1,7 +1,9 @@ -use crate::dirs_rs; use std::env; use std::path::{Path, PathBuf}; +use dirs; +use lazy_static::lazy_static; + /// Wrapper for 'dirs' that treats MacOS more like Linux, by following the XDG specification. /// This means that the `XDG_CACHE_HOME` and `XDG_CONFIG_HOME` environment variables are /// checked first. The fallback directories are `~/.cache/bat` and `~/.config/bat`, respectively. @@ -18,10 +20,10 @@ impl BatProjectDirs { let config_dir_op = env::var_os("XDG_CONFIG_HOME") .map(PathBuf::from) .filter(|p| p.is_absolute()) - .or_else(|| dirs_rs::home_dir().map(|d| d.join(".config"))); + .or_else(|| dirs::home_dir().map(|d| d.join(".config"))); #[cfg(not(target_os = "macos"))] - let config_dir_op = dirs_rs::config_dir(); + let config_dir_op = dirs::config_dir(); let config_dir = config_dir_op.map(|d| d.join("bat"))?; @@ -42,10 +44,10 @@ impl BatProjectDirs { let cache_dir_op = env::var_os("XDG_CACHE_HOME") .map(PathBuf::from) .filter(|p| p.is_absolute()) - .or_else(|| dirs_rs::home_dir().map(|d| d.join(".cache"))); + .or_else(|| dirs::home_dir().map(|d| d.join(".cache"))); #[cfg(not(target_os = "macos"))] - let cache_dir_op = dirs_rs::cache_dir(); + let cache_dir_op = dirs::cache_dir(); cache_dir_op.map(|d| d.join("bat")) } diff --git a/src/bin/bat/main.rs b/src/bin/bat/main.rs index 17138d05..9fe95c78 100644 --- a/src/bin/bat/main.rs +++ b/src/bin/bat/main.rs @@ -4,9 +4,13 @@ #[macro_use] extern crate clap; +extern crate dirs as dirs_rs; + mod app; mod clap_app; mod config; +mod directories; +mod assets; use std::collections::HashSet; use std::ffi::OsStr; @@ -19,10 +23,12 @@ use ansi_term::Colour::Green; use ansi_term::Style; use crate::{app::App, config::config_file}; +use directories::PROJECT_DIRS; +use assets::{cache_dir, clear_assets, config_dir, assets_from_cache_or_binary}; use bat::controller::Controller; use bat::{ - assets::{cache_dir, clear_assets, config_dir, HighlightingAssets}, + assets::HighlightingAssets, errors::*, inputfile::InputFile, style::{OutputComponent, OutputComponents}, @@ -31,8 +37,8 @@ use bat::{ fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> { if matches.is_present("build") { - let source_dir = matches.value_of("source").map(Path::new); - let target_dir = matches.value_of("target").map(Path::new); + let source_dir = matches.value_of("source").map(Path::new).unwrap_or_else(|| PROJECT_DIRS.config_dir()); + let target_dir = matches.value_of("target").map(Path::new).unwrap_or_else(|| PROJECT_DIRS.cache_dir()); let blank = matches.is_present("blank"); @@ -46,7 +52,7 @@ fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> { } pub fn list_languages(config: &Config) -> Result<()> { - let assets = HighlightingAssets::new(); + let assets = assets_from_cache_or_binary(); let mut languages = assets .syntax_set .syntaxes() @@ -109,7 +115,7 @@ pub fn list_languages(config: &Config) -> Result<()> { } pub fn list_themes(cfg: &Config) -> Result<()> { - let assets = HighlightingAssets::new(); + let assets = assets_from_cache_or_binary(); let themes = &assets.theme_set.themes; let mut config = cfg.clone(); let mut style = HashSet::new(); @@ -141,7 +147,7 @@ pub fn list_themes(cfg: &Config) -> Result<()> { } fn run_controller(config: &Config) -> Result { - let assets = HighlightingAssets::new(); + let assets = assets_from_cache_or_binary(); let controller = Controller::new(&config, &assets); controller.run() } diff --git a/src/lib.rs b/src/lib.rs index 2172892f..95536f4c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,9 +4,6 @@ #[macro_use] extern crate error_chain; -#[macro_use] -extern crate lazy_static; - extern crate ansi_term; extern crate atty; extern crate console; @@ -22,7 +19,6 @@ pub mod assets; pub mod controller; mod decorations; mod diff; -pub mod dirs; pub mod inputfile; mod less; pub mod line_range; diff --git a/src/line_range.rs b/src/line_range.rs index 5dfbd3b3..a6b68d31 100644 --- a/src/line_range.rs +++ b/src/line_range.rs @@ -6,20 +6,22 @@ pub struct LineRange { pub upper: usize, } -impl LineRange { - pub fn from(range_raw: &str) -> Result { - LineRange::parse_range(range_raw) - } - - pub fn new() -> LineRange { +impl Default for LineRange { + fn default() -> LineRange { LineRange { lower: usize::min_value(), upper: usize::max_value(), } } +} + +impl LineRange { + pub fn from(range_raw: &str) -> Result { + LineRange::parse_range(range_raw) + } pub fn parse_range(range_raw: &str) -> Result { - let mut new_range = LineRange::new(); + let mut new_range = LineRange::default(); if range_raw.bytes().nth(0).ok_or("Empty line range")? == b':' { new_range.upper = range_raw[1..].parse()?; @@ -103,12 +105,18 @@ pub enum RangeCheckResult { AfterLastRange, } -#[derive(Debug, Clone, Default)] +#[derive(Debug, Clone)] pub struct LineRanges { ranges: Vec, largest_upper_bound: usize, } +impl Default for LineRanges { + fn default() -> Self { + LineRanges::from(vec![LineRange { lower: 0, upper: 0 }]) + } +} + impl LineRanges { pub fn from(ranges: Vec) -> LineRanges { let largest_upper_bound = ranges diff --git a/tests/no_duplicate_extensions.rs b/tests/no_duplicate_extensions.rs index ef9e76a9..b87a1f9c 100644 --- a/tests/no_duplicate_extensions.rs +++ b/tests/no_duplicate_extensions.rs @@ -19,7 +19,7 @@ fn no_duplicate_extensions() { "sass", ]; - let assets = HighlightingAssets::new(); + let assets = HighlightingAssets::from_binary(); let mut extensions = HashSet::new(); diff --git a/tests/syntax_detection.rs b/tests/syntax_detection.rs index ac155959..751c3173 100644 --- a/tests/syntax_detection.rs +++ b/tests/syntax_detection.rs @@ -18,7 +18,7 @@ struct SyntaxDetectionTest { impl SyntaxDetectionTest { fn new() -> Self { SyntaxDetectionTest { - assets: HighlightingAssets::new(), + assets: HighlightingAssets::from_binary(), syntax_mapping: SyntaxMapping::new(), temp_dir: TempDir::new("bat_syntax_detection_tests") .expect("creation of temporary directory"),