diff --git a/Cargo.lock b/Cargo.lock index 0c80836d0bedb2b16506508e5533ceaa7a0d4c69..eeab304acd93920c90e62262212f7c28ad91fd31 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,17 @@ version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4361135be9122e0870de935d7c439aef945b9f9ddd4199a553b5270b49c82a27" +[[package]] +name = "async-recursion" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cda8f4bcc10624c4e85bc66b3f452cca98cfa5ca002dc83a16aad2367641bea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "async-trait" version = "0.1.52" @@ -381,6 +392,7 @@ name = "nm-reactor" version = "0.1.0" dependencies = [ "anyhow", + "async-recursion", "async-trait", "clap", "collective", diff --git a/Cargo.toml b/Cargo.toml index 4c0a5472a1c7008e1367736059dba090d52216d1..f3254c8ae86245d056c1016c9f3414fd391f958f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,3 +28,4 @@ num-traits = "0.2" futures = "0.3.18" async-trait = "0.1.52" nm-reactor_dbus_codegen = {path = "dbus_codegen"} +async-recursion = "1.0" diff --git a/src/condition.rs b/src/condition.rs index a523683f6d02a532c372ba623e781e106a6acfed..7d03aa7ede60f8bbdc3d3fcd199b8863347920af 100644 --- a/src/condition.rs +++ b/src/condition.rs @@ -1,6 +1,7 @@ use std::{collections::HashSet, sync::Arc}; use anyhow::Result; +use async_recursion::async_recursion; use dbus::nonblock::SyncConnection; use futures::{stream, StreamExt}; use serde_derive::{Deserialize, Serialize}; @@ -62,9 +63,13 @@ pub enum Condition { StateIsAnyOf { states: HashSet<State>, }, + Not { + condition: Box<Condition>, + } } impl Condition { + #[async_recursion] pub async fn evaluate(&self, conn: &Arc<SyncConnection>) -> Result<bool> { match self { Condition::AlwaysTrue => Ok(true), @@ -156,6 +161,11 @@ impl Condition { Ok(states.contains(&manager.get_state().await?)) } + Condition::Not { condition } => { + let result = condition.evaluate(conn).await?; + + Ok(!result) + } } } }