1
0
зеркало из https://github.com/glebtv/tui-textarea.git synced 2026-09-07 07:55:50 +03:00

feat(textarea): add atomic range editing support (#19)

- add public AtomicRange API with validation and diagnostic errors
- make cursor movement, deletion, insertion, selection, undo/redo, and set_lines atom-aware
- clear caller-derived atomic ranges after successful content mutations
- add focused atomic range tests plus serde coverage
- document atomic ranges and add a caller-owned parsing example
Этот коммит содержится в:
srothgan
2026-06-30 20:17:20 +02:00
коммит произвёл GitHub
родитель 8f708cfdc7
Коммит 9c4db800ef
6 изменённых файлов: 741 добавлений и 23 удалений

Просмотреть файл

@@ -1,6 +1,9 @@
#![cfg(feature = "serde")]
use tui_textarea::{CursorMove, Input, Key, Scrolling};
use tui_textarea::{
AtomicCursorBias, AtomicDeleteDirection, AtomicRange, AtomicRangeError,
AtomicRangeRejectReason, CursorMove, Input, Key, RejectedAtomicRange, Scrolling,
};
#[test]
fn test_serde_key() {
@@ -45,3 +48,35 @@ fn test_serde_cursor_move() {
let d: CursorMove = serde_json::from_str(&s).unwrap();
assert_eq!(d, c);
}
#[test]
fn test_serde_atomic_types() {
let range = AtomicRange {
row: 1,
start_col: 2,
end_col: 5,
};
let s = serde_json::to_string(&range).unwrap();
assert_eq!(s, r#"{"row":1,"start_col":2,"end_col":5}"#);
let d: AtomicRange = serde_json::from_str(&s).unwrap();
assert_eq!(d, range);
let error = AtomicRangeError {
rejected: vec![RejectedAtomicRange {
range,
reason: AtomicRangeRejectReason::OverlapsPrevious,
}],
};
let s = serde_json::to_string(&error).unwrap();
let d: AtomicRangeError = serde_json::from_str(&s).unwrap();
assert_eq!(d, error);
assert_eq!(
serde_json::to_string(&AtomicCursorBias::Forward).unwrap(),
r#""Forward""#
);
assert_eq!(
serde_json::to_string(&AtomicDeleteDirection::Backward).unwrap(),
r#""Backward""#
);
}