A skeletal state machine, wip.
authorSunil Nimmagadda <sunil@nimmagadda.net>
Sun, 01 Jan 2023 12:00:44 +0530
changeset 9 bde5cce81a8a
parent 8 e4cad4eba60b
child 10 aef7eb135a0c
A skeletal state machine, wip.
src/main.rs
--- a/src/main.rs	Sun Jan 01 11:59:24 2023 +0530
+++ b/src/main.rs	Sun Jan 01 12:00:44 2023 +0530
@@ -1,15 +1,33 @@
 use tokio::signal::unix;
 use tokio::time;
 
-const ADV_INTERVAL: u64 = 3;
-const SKEW_INTERVAL: u64 = 1;
+const ADV_INTERVAL: u64 = 1;
+
+#[derive(Debug)]
+enum VRRPv2State {
+    Initialize,
+    Backup,
+    Master,
+}
+
+struct StateMachine {
+    state: VRRPv2State,
+}
+
+impl StateMachine {
+    fn new() -> Self {
+        StateMachine {
+            state: VRRPv2State::Initialize,
+        }
+    }
+    fn transit_to(&mut self, new_state: VRRPv2State) {
+        std::println!("vvrpd: {:?} -> {:?}", self.state, new_state);
+        self.state = new_state;
+    }
+}
 
 async fn advert_handler() {
-    println!("3 second timer fired");
-}
-
-async fn skew_handler() {
-    println!("1 second timer fired");
+    println!("advert timer fired");
 }
 
 async fn sighup_handler() {
@@ -18,20 +36,13 @@
 
 #[tokio::main(flavor = "current_thread")]
 async fn main() {
-    let advert_handle = tokio::spawn(async move {
+    let advert_timer_handle = tokio::spawn(async move {
         let mut advert_interval = time::interval(time::Duration::from_secs(ADV_INTERVAL));
         loop {
             advert_interval.tick().await;
             advert_handler().await;
         }
     });
-    let skew_handle = tokio::spawn(async move {
-        let mut skew_interval = time::interval(time::Duration::from_secs(SKEW_INTERVAL));
-        loop {
-            skew_interval.tick().await;
-            skew_handler().await;
-        }
-    });
     let sighup_handle = tokio::spawn(async move {
         let mut stream =
             unix::signal(unix::SignalKind::hangup()).expect("Should be a signal stream");
@@ -40,5 +51,8 @@
             sighup_handler().await;
         }
     });
-    tokio::try_join!(advert_handle, skew_handle, sighup_handle).expect("task(s) erred");
+    let mut sm = StateMachine::new();
+    sm.transit_to(VRRPv2State::Master);
+    sm.transit_to(VRRPv2State::Backup);
+    tokio::try_join!(advert_timer_handle, sighup_handle).expect("task(s) erred");
 }