mod connection;
mod plugin;
use log::error;
use std::process::ExitStatus;
use std::sync::mpsc::{RecvError, SendError};
use thiserror::Error;
use crate::bson::BsonError;
use crate::msg::{ErrorResponse, Request, Response};
#[derive(Debug, Error)]
pub enum PluginError {
#[error(transparent)]
Bson(#[from] BsonError),
#[error("{0}")]
Response(ErrorResponse),
#[error("invalid response")]
InvalidResponse,
#[error(transparent)]
ChannelSendRequest(#[from] SendError<Request>),
#[error(transparent)]
ChannelSendResponse(#[from] SendError<Response>),
#[error(transparent)]
ChannelRecv(#[from] RecvError),
#[error("channel is closed")]
ChannelClosed,
#[error("short plugin infos")]
ShortPluginInfo,
#[error("failed to fetch plugin information, plugin exited with {0}")]
BadPluginInfo(ExitStatus),
#[error(transparent)]
Io(#[from] std::io::Error),
#[error("not connected")]
NotConnected,
}
type PluginResult<T> = std::result::Result<T, PluginError>;
pub use connection::PluginConnection;
pub use plugin::Plugin;