use crate::error::{VtxError, VtxResult};
use crate::modules::event::PluginEvent;
use crate::modules::net::http::{Request, Response, ResponseBuilder};
use crate::{Capabilities, Manifest, UserContext};
pub trait VtxPlugin {
fn handle(_req: Request) -> VtxResult<Response> {
Ok(ResponseBuilder::not_found())
}
fn handle_event(_event: PluginEvent) -> VtxResult<()> {
Ok(())
}
fn get_migrations() -> Vec<String> {
Vec::new()
}
fn get_manifest() -> Manifest;
fn get_resources() -> Vec<String> {
Vec::new()
}
fn get_capabilities() -> Capabilities;
fn authenticate(_headers: &[(String, String)]) -> VtxResult<UserContext> {
Err(VtxError::AuthDenied(401))
}
}
#[macro_export]
macro_rules! export_plugin {
($plugin:ty) => {
$crate::export_plugin!($plugin => __VtxSdkGuest);
};
($plugin:ty => $guest:ident) => {
struct $guest;
impl $crate::bindings::Guest for $guest {
fn handle(req: $crate::http::Request) -> $crate::http::Response {
match <$plugin as $crate::plugin::VtxPlugin>::handle(req) {
Ok(resp) => resp,
Err(err) => $crate::http::ResponseBuilder::error(err),
}
}
fn handle_event(event: $crate::event::PluginEvent) -> Result<(), String> {
match <$plugin as $crate::plugin::VtxPlugin>::handle_event(event) {
Ok(()) => Ok(()),
Err(err) => Err(err.to_string()),
}
}
fn get_migrations() -> Vec<String> {
<$plugin as $crate::plugin::VtxPlugin>::get_migrations()
}
fn get_manifest() -> $crate::Manifest {
<$plugin as $crate::plugin::VtxPlugin>::get_manifest()
}
fn get_resources() -> Vec<String> {
<$plugin as $crate::plugin::VtxPlugin>::get_resources()
}
fn get_capabilities() -> $crate::Capabilities {
<$plugin as $crate::plugin::VtxPlugin>::get_capabilities()
}
fn authenticate(
headers: Vec<(String, String)>,
) -> Result<$crate::UserContext, u16> {
use $crate::auth::IntoAuthResult as _;
<$plugin as $crate::plugin::VtxPlugin>::authenticate(&headers).into_auth_result()
}
}
$crate::export!($guest);
};
}