This commit is contained in:
cool-mist
2026-07-20 19:03:33 +05:30
commit 1c1d3c5755
6 changed files with 111 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
/target/
**/target/
**/*.rs.bk
*.pdb
.idea/
.vscode/
*.iml
.DS_Store
Thumbs.db
.env
Generated
+7
View File
@@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "hd-bus"
version = "0.1.0"
+5
View File
@@ -0,0 +1,5 @@
[workspace]
members = [
"crates/*"
]
resolver = "2"
+3
View File
@@ -0,0 +1,3 @@
# Heimdall
A Pub-Sub system for home automation
+6
View File
@@ -0,0 +1,6 @@
[package]
name = "hd-bus"
version = "0.1.0"
edition = "2024"
[dependencies]
+80
View File
@@ -0,0 +1,80 @@
use std::{
collections::VecDeque, sync::{RwLock, mpsc::{Receiver, Sender}},
};
pub enum HError {
BusLockPoisoned(String),
}
pub struct Event {
id: u64,
topic_name: String,
data_utf8: Vec<u8>,
}
pub struct EventBus {
queue: RwLock<VecDeque<Event>>,
subscriptions: RwLock<Vec<Subscription>>,
processor: Sender<EventProcessRequest>,
}
pub trait SubscriptionEndpoint {
fn deliver(&self, evt: &Event);
}
struct ConsoleEndpoint;
impl SubscriptionEndpoint for ConsoleEndpoint {
fn deliver(&self, evt: &Event) {
let data = String::from_utf8_lossy(&evt.data_utf8);
println!("({}, {}, {})", evt.id, evt.topic_name, data);
}
}
pub struct Subscription {
topic_pattern: String,
/// from_id is inclusive
from_id: u64,
endpoint: Box<dyn SubscriptionEndpoint>,
}
impl EventBus {
pub fn new() -> Self {
Self {
queue: RwLock::new(VecDeque::new()),
subscriptions: RwLock::new(Vec::new()),
}
}
pub fn publish(&self, evt: Event) -> Result<(), HError> {
let mut queue = self
.queue
.write()
.map_err(|e| HError::BusLockPoisoned(e.to_string()))?;
queue.push_back(evt);
Ok(())
}
pub fn subscribe(&self, request: Subscription) -> Result<(), HError> {
let mut subscriptions = self
.subscriptions
.write()
.map_err(|e| HError::BusLockPoisoned(e.to_string()))?;
subscriptions.push(request);
Ok(())
}
}
struct EventProcessRequest {
id: u64,
}
struct EventBusProcessor {
last_processed_id: u64,
work: Receiver<u64>,
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {}
}