use std::fmt::{Debug, Formatter, Result};
use get_size::GetSize;
use r3bl_rs_utils_core::*;
use serde::*;
use crate::*;
#[derive(Clone, PartialEq, Serialize, Deserialize, GetSize)]
pub struct EditorBuffer {
lines: Vec<UnicodeString>,
caret: Position,
scroll_offset: ScrollOffset,
file_extension: String,
}
mod constructor {
use super::*;
impl EditorBuffer {
pub fn new_empty(file_extension: String) -> Self {
call_if_true!(DEBUG_TUI_MOD, {
let msg = format!(
"🪙 {}",
"construct EditorBuffer { lines, caret, lolcat, file_extension }"
);
log_debug(msg);
});
Self {
lines: vec![UnicodeString::default()],
caret: Position::default(),
scroll_offset: ScrollOffset::default(),
file_extension,
}
}
}
}
pub enum CaretKind {
Raw,
ScrollAdjusted,
}
pub mod access_and_mutate {
use super::*;
impl EditorBuffer {
pub fn get_file_extension(&self) -> &str { &self.file_extension }
pub fn is_empty(&self) -> bool { self.lines.is_empty() }
pub fn len(&self) -> ChUnit { ch!(self.lines.len()) }
pub fn get_lines(&self) -> &Vec<UnicodeString> { &self.lines }
pub fn get_as_string(&self) -> String {
self.get_lines()
.iter()
.map(|l| l.string.clone())
.collect::<Vec<String>>()
.join(", ")
}
pub fn set_lines(&mut self, lines: Vec<String>) {
self.lines = lines.into_iter().map(UnicodeString::from).collect();
self.caret = Position::default();
self.scroll_offset = ScrollOffset::default();
}
pub fn get_caret(&self, kind: CaretKind) -> Position {
match kind {
CaretKind::Raw => self.caret,
CaretKind::ScrollAdjusted => {
position! {
col_index: Self::calc_scroll_adj_caret_col(&self.caret, &self.scroll_offset),
row_index: Self::calc_scroll_adj_caret_row(&self.caret, &self.scroll_offset)
}
}
}
}
pub fn calc_scroll_adj_caret_row(caret: &Position, scroll_offset: &ScrollOffset) -> usize {
ch!(@to_usize caret.row_index + scroll_offset.row_index)
}
pub fn calc_scroll_adj_caret_col(caret: &Position, scroll_offset: &ScrollOffset) -> usize {
ch!(@to_usize caret.col_index + scroll_offset.col_index)
}
pub fn get_scroll_offset(&self) -> ScrollOffset { self.scroll_offset }
pub fn get_mut(
&mut self,
) -> (
/* lines */ &mut Vec<UnicodeString>,
/* caret */ &mut Position,
/* scroll_offset */ &mut ScrollOffset,
) {
(&mut self.lines, &mut self.caret, &mut self.scroll_offset)
}
}
}
mod debug_format_helpers {
use super::*;
impl Debug for EditorBuffer {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write! { f,
"\nEditorBuffer [ \n \
├ lines: {}, size: {}, \n \
└ ext: {:?}, caret: {:?}] \n \
]",
self.lines.len(), self.lines.get_heap_size(),
self.file_extension, self.caret,
}
}
}
}