use std::fmt::Debug;
use r3bl_rs_utils_core::*;
use serde::*;
use syntect::{highlighting::Theme, parsing::SyntaxSet};
use crate::*;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EditorEngine {
pub current_box: PartialFlexBox,
pub config_options: EditorEngineConfigOptions,
pub syntax_set: SyntaxSet,
pub theme: Theme,
}
mod editor_engine_impl {
use super::*;
impl Default for EditorEngine {
fn default() -> Self { EditorEngine::new(Default::default()) }
}
impl EditorEngine {
pub fn new(config_options: EditorEngineConfigOptions) -> Self {
Self {
current_box: Default::default(),
config_options,
syntax_set: SyntaxSet::load_defaults_newlines(),
theme: try_load_r3bl_theme().unwrap_or_else(|_| load_default_theme()),
}
}
pub fn viewport_width(&self) -> ChUnit {
self.current_box.style_adjusted_bounds_size.col_count
}
pub fn viewport_height(&self) -> ChUnit {
self.current_box.style_adjusted_bounds_size.row_count
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct EditorEngineConfigOptions {
pub multiline_mode: EditorLineMode,
pub syntax_highlight: SyntaxHighlightConfig,
}
mod editor_engine_config_options_impl {
use super::*;
impl Default for EditorEngineConfigOptions {
fn default() -> Self {
Self {
multiline_mode: EditorLineMode::MultiLine,
syntax_highlight: SyntaxHighlightConfig::Enable(
DEFAULT_SYN_HI_FILE_EXT.to_string(),
),
}
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum EditorLineMode {
SingleLine,
MultiLine,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum SyntaxHighlightConfig {
Disable,
Enable(String),
}
mod syntax_highlight_config_impl {
use super::*;
impl SyntaxHighlightConfig {
pub fn get_file_extension_for_new_empty_buffer(&self) -> String {
match self {
SyntaxHighlightConfig::Disable => DEFAULT_SYN_HI_FILE_EXT.to_string(),
SyntaxHighlightConfig::Enable(ref ext) => ext.clone(),
}
}
}
}