use std::collections::HashMap;
use crate::error::{PluginError, Result};
use crate::proto::plugin as proto;
use crate::protocol::{DispatchContext, ParamValue, PollOutcome};
#[derive(Debug, Clone, Copy)]
pub enum AssemblyPayload<'a> {
Full(&'a [u8]),
Delta(&'a [u8]),
}
impl<'a> AssemblyPayload<'a> {
#[must_use]
pub fn bytes(&self) -> &'a [u8] {
match self {
AssemblyPayload::Full(b) | AssemblyPayload::Delta(b) => b,
}
}
#[must_use]
pub fn is_delta(&self) -> bool {
matches!(self, AssemblyPayload::Delta(_))
}
}
pub trait Plugin: Send {
fn init(
&self,
assembly_bytes: &[u8],
assets: &[proto::PuzzleAsset],
params: &HashMap<String, ParamValue>,
) -> Result<(u64, Vec<u8>)>;
fn register(&self) -> Result<proto::PluginRegistration>;
fn update_assembly(
&self,
session: u64,
payload: AssemblyPayload<'_>,
from_gen: u64,
to_gen: u64,
) -> Result<()>;
fn drop_session(&self, session: u64) -> Result<()>;
fn invoke(
&self,
_session: u64,
_op: &str,
_ctx: &DispatchContext,
_params: &HashMap<String, ParamValue>,
) -> Result<Vec<u8>> {
Err(PluginError::Unsupported)
}
#[allow(clippy::too_many_arguments)]
fn start_stream(
&self,
_session: u64,
_op: &str,
_ctx: &DispatchContext,
_params: &HashMap<String, ParamValue>,
_request_id: u64,
) -> Result<()> {
Err(PluginError::Unsupported)
}
fn poll_stream(&self, _request_id: u64) -> Result<PollOutcome> {
Err(PluginError::Unsupported)
}
fn update_stream(&self, _request_id: u64, _params: &HashMap<String, ParamValue>) -> Result<()> {
Err(PluginError::Unsupported)
}
fn cancel_stream(&self, _request_id: u64) -> Result<()> {
Err(PluginError::Unsupported)
}
#[allow(clippy::too_many_arguments)]
fn query(
&self,
_session: u64,
_query: &str,
_ctx: &DispatchContext,
_params: &HashMap<String, ParamValue>,
_assembly: &[u8],
) -> Result<Vec<u8>> {
Err(PluginError::Unsupported)
}
}