use crate::api::{
extension::{
ExtensionConfig, ExtensionLimits, Feature, MemoryRequirement, NamespaceEntry, ProviderId,
ServiceRegistration,
},
Version,
};
use crate::provider::{ExtensionError, Lifecycle, ProcessId};
use std::{collections::BTreeSet, time::SystemTime};
pub trait ExtensionProvider: Send + Sync {
fn manifest(&self) -> ExtensionManifest;
fn prepare(
&self,
context: &PrepareContext,
config: &ExtensionConfig,
) -> Result<PreparedExtension, ExtensionError>;
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ExtensionManifest {
pub provider: ProviderId,
pub versions: Vec<Version>,
pub schema: String,
pub features: BTreeSet<Feature>,
pub limits: ExtensionLimits,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct PrepareContext {
pub process: ProcessId,
pub deadline: SystemTime,
}
pub struct PreparedExtension {
pub namespace: Vec<NamespaceEntry>,
pub services: Vec<ServiceRegistration>,
pub memory: Vec<MemoryRequirement>,
pub lifecycle: Option<Box<dyn Lifecycle>>,
}