use super::super::{
PluginEffectDiscardReport, PluginWorkspaceIoDiscardReport,
PluginWorkspaceObserveTaskDiscardReport, SealedPluginEffectBatch, SealedPluginWorkspaceIoBatch,
SealedPluginWorkspaceObserveTaskBatch,
};
use crate::plugin::PluginIdentity;
use std::fmt::{Debug, Formatter};
pub struct PluginHostImportBatches {
effects: SealedPluginEffectBatch,
workspace_io: SealedPluginWorkspaceIoBatch,
workspace_observe_tasks: SealedPluginWorkspaceObserveTaskBatch,
}
pub struct PluginHostImportOwnerAndTaskBatches {
pub owner_batches: PluginHostOwnerBatches,
pub workspace_observe_tasks: SealedPluginWorkspaceObserveTaskBatch,
}
pub struct PluginHostImportBatchesParts {
pub effects: SealedPluginEffectBatch,
pub workspace_io: SealedPluginWorkspaceIoBatch,
pub workspace_observe_tasks: SealedPluginWorkspaceObserveTaskBatch,
}
impl PluginHostImportBatches {
pub(super) fn new(
effects: SealedPluginEffectBatch,
workspace_io: SealedPluginWorkspaceIoBatch,
workspace_observe_tasks: SealedPluginWorkspaceObserveTaskBatch,
) -> Self {
assert_eq!(
effects.identity_proof(),
workspace_io.identity_proof(),
"plugin host import batches must share one identity",
);
assert_eq!(
effects.identity_proof(),
workspace_observe_tasks.identity_proof(),
"plugin host import batches must share one identity",
);
Self {
effects,
workspace_io,
workspace_observe_tasks,
}
}
#[must_use]
pub(crate) fn into_owner_and_workspace_observe_tasks(
self,
) -> PluginHostImportOwnerAndTaskBatches {
let Self {
effects,
workspace_io,
workspace_observe_tasks,
} = self;
PluginHostImportOwnerAndTaskBatches {
owner_batches: PluginHostOwnerBatches::from_parts(effects, workspace_io),
workspace_observe_tasks,
}
}
#[must_use]
pub fn into_parts(self) -> PluginHostImportBatchesParts {
PluginHostImportBatchesParts {
effects: self.effects,
workspace_io: self.workspace_io,
workspace_observe_tasks: self.workspace_observe_tasks,
}
}
}
#[derive(Eq, PartialEq)]
pub struct PluginHostOwnerBatches {
effects: SealedPluginEffectBatch,
workspace_io: SealedPluginWorkspaceIoBatch,
}
impl PluginHostOwnerBatches {
pub(crate) fn from_parts(
effects: SealedPluginEffectBatch,
workspace_io: SealedPluginWorkspaceIoBatch,
) -> Self {
assert_eq!(
effects.identity_proof(),
workspace_io.identity_proof(),
"plugin owner batches must share one identity",
);
Self {
effects,
workspace_io,
}
}
#[must_use]
pub fn identity(&self) -> &str {
self.identity_proof().as_str()
}
#[must_use]
pub const fn identity_proof(&self) -> &PluginIdentity {
self.effects.identity_proof()
}
#[must_use]
pub const fn effects(&self) -> &SealedPluginEffectBatch {
&self.effects
}
#[must_use]
pub const fn workspace_io(&self) -> &SealedPluginWorkspaceIoBatch {
&self.workspace_io
}
#[must_use]
pub const fn is_empty(&self) -> bool {
self.effects.is_empty() && self.workspace_io.is_empty()
}
#[must_use]
pub fn discard(self) -> PluginHostOwnerDiscardReport {
let parts = self.into_parts();
PluginHostOwnerDiscardReport::new(parts.effects.discard(), parts.workspace_io.discard())
}
#[must_use]
pub fn into_parts(self) -> PluginHostOwnerBatchesParts {
PluginHostOwnerBatchesParts {
effects: self.effects,
workspace_io: self.workspace_io,
}
}
#[cfg(test)]
pub(in crate::plugin) fn for_test(
effects: SealedPluginEffectBatch,
workspace_io: SealedPluginWorkspaceIoBatch,
) -> Self {
assert_eq!(effects.identity_proof(), workspace_io.identity_proof());
Self::from_parts(effects, workspace_io)
}
}
pub struct PluginHostOwnerBatchesParts {
pub effects: SealedPluginEffectBatch,
pub workspace_io: SealedPluginWorkspaceIoBatch,
}
#[derive(Eq, PartialEq)]
pub struct PluginHostOwnerDiscardReport {
effects: PluginEffectDiscardReport,
workspace_io: PluginWorkspaceIoDiscardReport,
}
impl PluginHostOwnerDiscardReport {
pub(super) fn new(
effects: PluginEffectDiscardReport,
workspace_io: PluginWorkspaceIoDiscardReport,
) -> Self {
assert_eq!(
effects.identity_proof(),
workspace_io.identity_proof(),
"plugin owner discard report must share one identity",
);
Self {
effects,
workspace_io,
}
}
#[must_use]
pub fn identity(&self) -> &str {
self.identity_proof().as_str()
}
#[must_use]
pub const fn identity_proof(&self) -> &PluginIdentity {
self.effects.identity_proof()
}
#[must_use]
pub const fn effects(&self) -> &PluginEffectDiscardReport {
&self.effects
}
#[must_use]
pub const fn workspace_io(&self) -> &PluginWorkspaceIoDiscardReport {
&self.workspace_io
}
}
impl Debug for PluginHostOwnerDiscardReport {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("PluginHostOwnerDiscardReport")
.field("identity", self.identity_proof())
.field("discarded_effect_count", &self.effects.discarded_effects())
.field(
"discarded_workspace_io_request_count",
&self.workspace_io.discarded_requests(),
)
.finish()
}
}
impl Debug for PluginHostOwnerBatches {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("PluginHostOwnerBatches")
.field("identity", self.identity_proof())
.field("effect_count", &self.effects.effect_count())
.field(
"workspace_io_request_count",
&self.workspace_io.request_count(),
)
.finish()
}
}
impl Debug for PluginHostImportBatches {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("PluginHostImportBatches")
.field("identity", self.effects.identity_proof())
.field("effect_count", &self.effects.effect_count())
.field(
"workspace_io_request_count",
&self.workspace_io.request_count(),
)
.field(
"workspace_observe_task_count",
&self.workspace_observe_tasks.task_count(),
)
.finish()
}
}
#[derive(Eq, PartialEq)]
pub struct PluginHostImportDiscardReport {
effects: PluginEffectDiscardReport,
workspace_io: PluginWorkspaceIoDiscardReport,
workspace_observe_tasks: PluginWorkspaceObserveTaskDiscardReport,
}
impl PluginHostImportDiscardReport {
pub(super) fn new(
effects: PluginEffectDiscardReport,
workspace_io: PluginWorkspaceIoDiscardReport,
workspace_observe_tasks: PluginWorkspaceObserveTaskDiscardReport,
) -> Self {
assert_eq!(
effects.identity_proof(),
workspace_io.identity_proof(),
"plugin host import discard report must share one identity",
);
assert_eq!(
effects.identity_proof(),
workspace_observe_tasks.identity_proof(),
"plugin host import discard report must share one identity",
);
Self {
effects,
workspace_io,
workspace_observe_tasks,
}
}
#[must_use]
pub fn identity(&self) -> &str {
self.identity_proof().as_str()
}
#[must_use]
pub const fn identity_proof(&self) -> &PluginIdentity {
self.effects.identity_proof()
}
#[must_use]
pub const fn effects(&self) -> &PluginEffectDiscardReport {
&self.effects
}
#[must_use]
pub const fn workspace_io(&self) -> &PluginWorkspaceIoDiscardReport {
&self.workspace_io
}
#[must_use]
pub const fn workspace_observe_tasks(&self) -> &PluginWorkspaceObserveTaskDiscardReport {
&self.workspace_observe_tasks
}
}
impl Debug for PluginHostImportDiscardReport {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("PluginHostImportDiscardReport")
.field("identity", self.identity_proof())
.field("discarded_effect_count", &self.effects.discarded_effects())
.field(
"discarded_workspace_io_request_count",
&self.workspace_io.discarded_requests(),
)
.field(
"discarded_workspace_observe_task_count",
&self.workspace_observe_tasks.discarded_tasks(),
)
.finish()
}
}