mod input;
mod mime;
mod theme;
pub use input::{Action, InputBinding, InputMap, KeyCombination};
pub use theme::{Color, Syntax, Theme};
use crate::{EditorError, tui::mime::MimeMap};
use ::mime::Mime;
use editor_command::Editor;
use serde::Serialize;
use std::env;
#[derive(Debug, Serialize)]
#[cfg_attr(test, derive(PartialEq))]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "schema", schemars(default))]
pub struct TuiConfig {
pub commands: CommandsConfig,
#[serde(alias = "viewer", default)]
pub pager: MimeMap<String>,
pub preview_templates: bool,
pub input_bindings: InputMap,
pub theme: Theme,
#[serde(skip_serializing)]
#[cfg_attr(feature = "schema", schemars(skip))]
pub debug: bool,
pub persist: bool,
}
impl TuiConfig {
pub fn pager(&self, mime: Option<&Mime>) -> Result<Editor, EditorError> {
let default = if cfg!(windows) { "more" } else { "less" };
let config_command = mime
.and_then(|mime| self.pager.get(mime))
.map(String::as_str);
editor_command::EditorBuilder::new()
.string(config_command)
.string(env::var("PAGER").ok())
.string(Some(default))
.build()
.map_err(EditorError)
}
}
impl Default for TuiConfig {
fn default() -> Self {
Self {
commands: CommandsConfig::default(),
pager: Default::default(),
preview_templates: true,
input_bindings: Default::default(),
theme: Default::default(),
debug: false,
persist: true,
}
}
}
#[derive(Debug, Serialize)]
#[cfg_attr(test, derive(PartialEq))]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "schema", schemars(default))]
pub struct CommandsConfig {
pub shell: Vec<String>,
#[serde(default)]
pub default_query: MimeMap<String>,
}
impl Default for CommandsConfig {
fn default() -> Self {
let default_shell: &[&str] = if cfg!(windows) {
&["cmd", "/S", "/C"]
} else {
&["/bin/sh", "-c"]
};
Self {
shell: default_shell.iter().map(ToString::to_string).collect(),
default_query: MimeMap::default(),
}
}
}