use crate::{
buffer::BufferEditShape,
ecs::{
components::buffer::BufferEntity,
events::{
edit::{PluginBufferEditProvenance, RevisionGuardedBufferEditRequested},
status::{StatusMessage, StatusMessageRequested},
},
},
plugin::PluginIdentity,
text_stream::TextRevision,
};
use std::fmt::{Debug, Formatter};
#[derive(Eq, PartialEq)]
pub(in crate::plugin::host::effect) enum PluginEffect {
BufferEdit(PluginBufferEditProposal),
Status(StatusMessageRequested),
}
impl PluginEffect {
pub(in crate::plugin::host::effect) fn shape(&self) -> PluginEffectShape {
PluginEffectShape::from(self)
}
}
impl Debug for PluginEffect {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("PluginEffect")
.field("shape", &self.shape())
.finish()
}
}
#[derive(Eq, PartialEq)]
pub struct PluginBufferEditProposal {
target: BufferEntity,
edit: crate::buffer::BufferEdit,
base_revision: TextRevision,
}
impl PluginBufferEditProposal {
#[must_use]
pub const fn from_observed_revision(
target: BufferEntity,
edit: crate::buffer::BufferEdit,
base_revision: TextRevision,
) -> Self {
Self {
target,
edit,
base_revision,
}
}
#[must_use]
pub const fn target(&self) -> BufferEntity {
self.target
}
#[must_use]
pub const fn base_revision(&self) -> TextRevision {
self.base_revision
}
pub(in crate::plugin::host::effect) fn into_request(
self,
source_identity: &PluginIdentity,
) -> RevisionGuardedBufferEditRequested {
RevisionGuardedBufferEditRequested {
target: self.target,
provenance: PluginBufferEditProvenance::buffer_propose_edit(
source_identity.clone(),
self.base_revision,
),
edit: self.edit,
}
}
}
impl Debug for PluginBufferEditProposal {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("PluginBufferEditProposal")
.field("target", &PluginEffectTargetShape::Buffer)
.field("edit", &BufferEditShape::from_edit(&self.edit))
.field("base_revision", &self.base_revision)
.finish()
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(in crate::plugin::host::effect) enum PluginEffectTargetShape {
Buffer,
View,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(in crate::plugin::host::effect) enum PluginEffectShape {
BufferEdit {
edit: BufferEditShape,
},
Status {
status: PluginStatusMessageShape,
},
}
impl From<&PluginEffect> for PluginEffectShape {
fn from(effect: &PluginEffect) -> Self {
match effect {
PluginEffect::BufferEdit(effect) => Self::BufferEdit {
edit: BufferEditShape::from_edit(&effect.edit),
},
PluginEffect::Status(request) => Self::Status {
status: PluginStatusMessageShape::from(&request.message),
},
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(in crate::plugin::host::effect) enum PluginStatusMessageShape {
Clear,
Info {
byte_len: usize,
},
Error,
}
impl From<&StatusMessage> for PluginStatusMessageShape {
fn from(message: &StatusMessage) -> Self {
match message {
StatusMessage::Clear => Self::Clear,
StatusMessage::Info(text) => Self::Info {
byte_len: text.as_str().len(),
},
StatusMessage::Error(_error) => Self::Error,
}
}
}