use crate::{
buffer::UndoStack,
text_stream::{TextByteStream, TextByteStreamShape, TextRevision},
};
use bevy::prelude::{Component, Entity};
use std::fmt::{Debug, Formatter};
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct BufferEntity(pub Entity);
impl BufferEntity {
pub const fn get(self) -> Entity {
self.0
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct ViewEntity(pub Entity);
impl ViewEntity {
pub const fn get(self) -> Entity {
self.0
}
}
#[derive(Clone, Copy, Component, Debug, Default, Eq, PartialEq)]
pub struct EditorBuffer;
#[derive(Clone, Copy, Component, Debug, Eq, PartialEq)]
pub struct EditorView {
pub buffer: BufferEntity,
}
#[derive(Clone, Copy, Component, Debug, Default, Eq, PartialEq)]
pub struct FocusedEditorView;
#[derive(Clone, Component, Default, Eq, PartialEq)]
pub struct BufferText {
pub stream: TextByteStream,
}
impl Debug for BufferText {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("BufferText")
.field("shape", &BufferTextShape::from(self))
.finish()
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct BufferTextShape {
stream: TextByteStreamShape,
}
impl BufferTextShape {
#[must_use]
pub fn from_buffer_text(buffer_text: &BufferText) -> Self {
Self::from(buffer_text)
}
#[must_use]
pub const fn stream(self) -> TextByteStreamShape {
self.stream
}
}
impl From<&BufferText> for BufferTextShape {
fn from(buffer_text: &BufferText) -> Self {
Self {
stream: TextByteStreamShape::from(&buffer_text.stream),
}
}
}
#[derive(Clone, Copy, Component, Debug, Default, Eq, PartialEq)]
pub struct BufferRevision {
pub revision: TextRevision,
}
#[derive(Clone, Component, Debug, Default, Eq, PartialEq)]
pub struct BufferUndoHistory {
stack: UndoStack,
}
impl BufferUndoHistory {
pub const fn stack_mut(&mut self) -> &mut UndoStack {
&mut self.stack
}
#[must_use]
pub const fn stack(&self) -> &UndoStack {
&self.stack
}
}
#[cfg(test)]
mod tests {
use super::BufferText;
use crate::text_stream::TextByteStream;
#[test]
fn buffer_text_debug_output_redacts_stream_text() {
let buffer_text = BufferText {
stream: TextByteStream::new("secret buffer text"),
};
let debug = format!("{buffer_text:?}");
assert!(debug.contains("BufferText"));
assert!(debug.contains("byte_len"));
assert!(!debug.contains("secret"));
assert!(!debug.contains("buffer text"));
}
}