mirror of
https://github.com/sharkdp/bat.git
synced 2025-10-29 22:24:35 +00:00
Initial prototype for Lua plugins
This commit is contained in:
@@ -241,6 +241,11 @@ impl App {
|
||||
.map(HighlightedLineRanges)
|
||||
.unwrap_or_default(),
|
||||
use_custom_assets: !self.matches.is_present("no-custom-assets"),
|
||||
plugins: self
|
||||
.matches
|
||||
.values_of_os("load-plugin")
|
||||
.unwrap_or_default()
|
||||
.collect(),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -474,6 +474,14 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
|
||||
.help("Display all supported languages.")
|
||||
.long_help("Display a list of supported languages for syntax highlighting."),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("load-plugin")
|
||||
.long("load-plugin")
|
||||
.takes_value(true)
|
||||
.value_name("name")
|
||||
.help("Load plugin with specified name.")
|
||||
.hidden_short_help(true)
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("unbuffered")
|
||||
.short("u")
|
||||
|
||||
@@ -8,6 +8,7 @@ mod directories;
|
||||
mod input;
|
||||
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::ffi::OsStr;
|
||||
use std::io;
|
||||
use std::io::{BufReader, Write};
|
||||
use std::path::Path;
|
||||
@@ -218,7 +219,51 @@ pub fn list_themes(cfg: &Config) -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn run_controller(inputs: Vec<Input>, config: &Config) -> Result<bool> {
|
||||
fn load_and_run_preprocess_plugins(plugins: &[&OsStr], inputs: &mut Vec<Input>) -> Result<()> {
|
||||
use bat::input::InputKind;
|
||||
use rlua::{Function, Lua, Result as LuaResult};
|
||||
use std::fs;
|
||||
use std::path::PathBuf;
|
||||
|
||||
let lua = Lua::new();
|
||||
|
||||
for plugin_name in plugins {
|
||||
// TODO: how to handle plugin priority?
|
||||
let mut plugin_path = PathBuf::from("plugins");
|
||||
plugin_path.push(plugin_name);
|
||||
|
||||
let plugin_source_code = fs::read_to_string(&plugin_path).unwrap(); // TODO: proper error handling
|
||||
|
||||
lua.context::<_, LuaResult<()>>(|lua_ctx| {
|
||||
let globals = lua_ctx.globals();
|
||||
|
||||
lua_ctx.load(&plugin_source_code).exec()?;
|
||||
|
||||
let preprocess: Function = globals.get("preprocess")?;
|
||||
|
||||
for input in inputs.iter_mut() {
|
||||
if let InputKind::OrdinaryFile(ref mut path) = &mut input.kind {
|
||||
let path_str: String = path.to_string_lossy().into();
|
||||
let new_path = preprocess.call::<_, String>(path_str)?;
|
||||
|
||||
*path = PathBuf::from(new_path);
|
||||
|
||||
input.metadata.user_provided_name =
|
||||
Some(PathBuf::from(path.file_name().unwrap())); // TODO
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
})
|
||||
.map_err(|e| format!("Error while executing Lua code: {}", e))?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn run_controller(mut inputs: Vec<Input>, config: &Config) -> Result<bool> {
|
||||
load_and_run_preprocess_plugins(&config.plugins, &mut inputs)?;
|
||||
|
||||
let assets = assets_from_cache_or_binary(config.use_custom_assets)?;
|
||||
let controller = Controller::new(config, &assets);
|
||||
controller.run(inputs)
|
||||
|
||||
@@ -5,6 +5,8 @@ use crate::style::StyleComponents;
|
||||
use crate::syntax_mapping::SyntaxMapping;
|
||||
use crate::wrapping::WrappingMode;
|
||||
|
||||
use std::ffi::OsStr;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum VisibleLines {
|
||||
/// Show all lines which are included in the line ranges
|
||||
@@ -86,6 +88,9 @@ pub struct Config<'a> {
|
||||
/// Whether or not to allow custom assets. If this is false or if custom assets (a.k.a.
|
||||
/// cached assets) are not available, assets from the binary will be used instead.
|
||||
pub use_custom_assets: bool,
|
||||
|
||||
/// List of bat plugins to be loaded
|
||||
pub plugins: Vec<&'a OsStr>,
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "minimal-application", feature = "paging"))]
|
||||
|
||||
12
src/input.rs
12
src/input.rs
@@ -69,7 +69,8 @@ impl InputDescription {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) enum InputKind<'a> {
|
||||
pub enum InputKind<'a> {
|
||||
// TODO
|
||||
OrdinaryFile(PathBuf),
|
||||
StdIn,
|
||||
CustomReader(Box<dyn Read + 'a>),
|
||||
@@ -86,14 +87,15 @@ impl<'a> InputKind<'a> {
|
||||
}
|
||||
|
||||
#[derive(Clone, Default)]
|
||||
pub(crate) struct InputMetadata {
|
||||
pub(crate) user_provided_name: Option<PathBuf>,
|
||||
pub struct InputMetadata {
|
||||
// TODO
|
||||
pub user_provided_name: Option<PathBuf>,
|
||||
pub(crate) size: Option<u64>,
|
||||
}
|
||||
|
||||
pub struct Input<'a> {
|
||||
pub(crate) kind: InputKind<'a>,
|
||||
pub(crate) metadata: InputMetadata,
|
||||
pub kind: InputKind<'a>, // TODO
|
||||
pub metadata: InputMetadata, // TODO
|
||||
pub(crate) description: InputDescription,
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user