Skip to main content

editor_core/
processing.rs

1//! Generic document processing interfaces.
2//!
3//! This module defines a shared "edit" format for derived editor state, such as:
4//! - syntax / semantic highlighting (style layers)
5//! - folding regions
6//!
7//! External crates (`editor-core-*`) can produce [`ProcessingEdit`] values and apply them to an
8//! [`EditorStateManager`] via
9//! [`EditorStateManager::apply_processing_edits`](crate::EditorStateManager::apply_processing_edits).
10
11use crate::EditorStateManager;
12use crate::intervals::{FoldRegion, Interval, StyleLayerId};
13
14/// A change to derived editor state (highlighting, folding, etc.).
15#[derive(Debug, Clone)]
16pub enum ProcessingEdit {
17    /// Replace an entire style layer with the given intervals (char offsets).
18    ReplaceStyleLayer {
19        /// The style layer being replaced.
20        layer: StyleLayerId,
21        /// The full set of style intervals for the layer (char offsets, half-open).
22        intervals: Vec<Interval>,
23    },
24    /// Clear a style layer.
25    ClearStyleLayer {
26        /// The style layer being cleared.
27        layer: StyleLayerId,
28    },
29    /// Replace folding regions.
30    ///
31    /// If `preserve_collapsed` is true, regions that match an existing collapsed region
32    /// (`start_line`, `end_line`) will remain collapsed after replacement.
33    ReplaceFoldingRegions {
34        /// The complete set of folding regions.
35        regions: Vec<FoldRegion>,
36        /// Whether to preserve the collapsed/expanded state for regions that still exist.
37        preserve_collapsed: bool,
38    },
39    /// Clear all folding regions.
40    ClearFoldingRegions,
41}
42
43/// A generic processor that produces [`ProcessingEdit`]s for an editor document.
44pub trait DocumentProcessor {
45    /// The error type returned by [`DocumentProcessor::process`].
46    type Error;
47
48    /// Compute derived state updates to apply to the editor.
49    ///
50    /// Implementations should avoid mutating `state`; instead, return edits that the caller can
51    /// apply (e.g. via [`EditorStateManager::apply_processing_edits`](crate::EditorStateManager::apply_processing_edits)).
52    fn process(&mut self, state: &EditorStateManager) -> Result<Vec<ProcessingEdit>, Self::Error>;
53}