diff options
Diffstat (limited to 'src/runtime.rs')
| -rw-r--r-- | src/runtime.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/runtime.rs b/src/runtime.rs new file mode 100644 index 0000000..96ffd0d --- /dev/null +++ b/src/runtime.rs @@ -0,0 +1,34 @@ +use crate::model::Trojan; +use anyhow::{Result, bail}; +use async_trait::async_trait; + +#[async_trait] +pub trait Runtime: Send { + /// Protection must be installed before durable enabled intent changes. + async fn arm(&mut self) -> Result<()>; + async fn apply(&mut self, connection: Option<&Trojan>, generation: u64) -> Result<()>; + async fn maintain(&mut self, connection: Option<&Trojan>, generation: u64) -> Result<()> { + self.apply(connection, generation).await + } + /// Called only after disabled intent has been durably recorded. + async fn disable(&mut self) -> Result<()>; + fn routing(&self) -> &str; +} + +/// Allows managing saved subscriptions without claiming that host capture is available. +pub struct OfflineRuntime; +#[async_trait] +impl Runtime for OfflineRuntime { + async fn arm(&mut self) -> Result<()> { + bail!("Host networking is unavailable; install and start the Roentgen service") + } + async fn apply(&mut self, _: Option<&Trojan>, _: u64) -> Result<()> { + bail!("Host networking is unavailable") + } + async fn disable(&mut self) -> Result<()> { + Ok(()) + } + fn routing(&self) -> &str { + "unavailable" + } +} |