pub mod sftp;
use async_trait::async_trait;
#[async_trait]
pub trait Subsystem: Send + Sync {
fn name(&self) -> &str;
async fn start(&mut self) -> Result<(), Box<dyn std::error::Error + Send + Sync>>;
async fn handle_data(&mut self, data: &[u8]) -> Result<Vec<u8>, Box<dyn std::error::Error + Send + Sync>>;
async fn shutdown(&mut self) -> Result<(), Box<dyn std::error::Error + Send + Sync>>;
}
pub struct SubsystemRegistry {
subsystems: Vec<Box<dyn Subsystem>>,
}
impl Default for SubsystemRegistry {
fn default() -> Self {
Self::new()
}
}
impl SubsystemRegistry {
pub fn new() -> Self {
let mut registry = SubsystemRegistry {
subsystems: Vec::new(),
};
registry.register(Box::new(sftp::SftpSubsystem::new()));
registry
}
pub fn register(&mut self, subsystem: Box<dyn Subsystem>) {
self.subsystems.push(subsystem);
}
pub fn get(&self, name: &str) -> Option<&dyn Subsystem> {
self.subsystems
.iter()
.find(|s| s.name() == name)
.map(|s| s.as_ref())
}
}