use crate::provider::{ExtensionError, Lifecycle, ProcessId};
use crate::api::{
extension::{
ExtensionCapability, ExtensionConfig, ExtensionLimits, ExtensionSelection, ExtensionSpec,
Feature, MemoryRequirement, NamespaceEntry, ProviderId, ServiceRegistration,
},
Version,
};
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>;
}
pub trait Extensions: Send + Sync {
fn capabilities(&self) -> Vec<ExtensionCapability>;
fn negotiate(&self, spec: &ExtensionSpec) -> Result<ExtensionSelection, 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>>,
}