use std::sync::Arc;
pub use crate::model::buffer::{Buffer, LineEnding, TextBuffer};
pub use crate::model::cursor::{Cursor, Cursors};
pub use crate::model::event::{Event, EventLog};
pub use crate::model::filesystem::{FileSystem, NoopFileSystem, StdFileSystem};
pub use crate::model::piece_tree::{PieceTree, Position};
const LARGE_FILE_THRESHOLD: usize = 100 * 1024 * 1024;
pub struct WasmEditor {
buffer: Buffer,
}
impl WasmEditor {
pub fn new() -> Self {
let fs: Arc<dyn FileSystem + Send + Sync> = Arc::new(NoopFileSystem);
Self {
buffer: Buffer::empty(fs),
}
}
pub fn with_content(content: &str) -> Self {
let fs: Arc<dyn FileSystem + Send + Sync> = Arc::new(NoopFileSystem);
Self {
buffer: Buffer::from_str(content, LARGE_FILE_THRESHOLD, fs),
}
}
pub fn content(&self) -> Option<String> {
self.buffer.to_string()
}
pub fn insert(&mut self, offset: usize, text: &str) {
self.buffer.insert(offset, text);
}
pub fn delete(&mut self, start: usize, end: usize) {
self.buffer.delete(start..end);
}
pub fn len(&self) -> usize {
self.buffer.len()
}
pub fn is_empty(&self) -> bool {
self.buffer.is_empty()
}
pub fn line_count(&self) -> Option<usize> {
self.buffer.line_count()
}
pub fn buffer(&self) -> &Buffer {
&self.buffer
}
pub fn buffer_mut(&mut self) -> &mut Buffer {
&mut self.buffer
}
}
impl Default for WasmEditor {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_wasm_editor_basic() {
let mut editor = WasmEditor::new();
assert!(editor.is_empty());
assert_eq!(editor.len(), 0);
editor.insert(0, "Hello, World!");
assert!(!editor.is_empty());
assert_eq!(editor.len(), 13);
assert_eq!(editor.content(), Some("Hello, World!".to_string()));
}
#[test]
fn test_wasm_editor_with_content() {
let editor = WasmEditor::with_content("Initial content");
assert_eq!(editor.content(), Some("Initial content".to_string()));
assert_eq!(editor.line_count(), Some(1));
}
#[test]
fn test_wasm_editor_delete() {
let mut editor = WasmEditor::with_content("Hello, World!");
editor.delete(5, 13); assert_eq!(editor.content(), Some("Hello".to_string()));
}
}