starlane_core/
watch.rs

1use std::collections::HashSet;
2
3use serde::{Deserialize, Serialize};
4use tokio::sync::mpsc;
5use uuid::Uuid;
6
7use starlane_resources::data::{BinSrc, DataSet};
8use starlane_resources::ResourceIdentifier;
9
10use crate::resource::ResourceKey;
11use crate::star::shell::watch::WatchApi;
12use crate::star::StarKey;
13use starlane_resources::status::Status;
14use std::hash::Hash;
15
16pub type WatchKey = Uuid;
17
18#[derive(Debug,Clone,Serialize,Deserialize)]
19pub struct Watch{
20    pub key: WatchKey,
21    pub selector: WatchSelector
22}
23
24impl Watch {
25    pub fn new(selection: WatchSelector) -> Self {
26        Self {
27            key: WatchKey::new_v4(),
28            selector: selection
29        }
30    }
31}
32
33#[derive(Debug,Clone,Serialize,Deserialize,Hash,Eq,PartialEq)]
34pub struct WatchResourceSelector {
35    pub resource: ResourceIdentifier,
36    pub property: Property
37}
38
39impl WatchResourceSelector {
40    pub fn new( resource: ResourceIdentifier, property: Property ) -> Self {
41        Self {
42            resource,
43            property
44        }
45    }
46}
47
48#[derive(Debug,Clone,Serialize,Deserialize,Hash,Eq,PartialEq)]
49pub struct WatchSelector {
50  pub topic: Topic,
51  pub property: Property
52}
53
54#[derive(Debug,Clone,Serialize,Deserialize,strum_macros::Display,Hash,Eq,PartialEq)]
55pub enum Topic{
56    Resource(ResourceKey),
57    Star(StarKey),
58}
59
60#[derive(Debug,Clone,Serialize,Deserialize,strum_macros::Display,Hash,Eq,PartialEq)]
61pub enum Property {
62    State,
63    Child,
64    Status
65}
66
67#[derive(Debug,Clone,Serialize,Deserialize)]
68pub struct Notification{
69    pub selector: WatchSelector,
70    pub changes: Vec<Change>
71}
72
73impl Notification {
74    pub fn new( selector: WatchSelector, change: Change ) -> Self {
75        Self {
76            selector,
77            changes: vec![change]
78        }
79    }
80}
81
82#[derive(Debug,Clone,Serialize,Deserialize,strum_macros::Display)]
83pub enum Change {
84    State(DataSet<BinSrc>),
85    Children(Vec<ChildChange>),
86    Status(Status)
87}
88
89#[derive(Debug,Clone,Serialize,Deserialize,strum_macros::Display)]
90pub enum ChildChange{
91    Add(Topic),
92    Remove(Topic)
93}
94
95#[derive(Clone,Serialize,Deserialize,Hash,Eq,PartialEq)]
96pub struct WatchStub{
97    pub key: WatchKey,
98    pub selection: WatchSelector
99}
100
101pub struct Watcher {
102    stub: WatchStub,
103    watch_api: WatchApi,
104    pub rx: mpsc::Receiver<Notification>
105}
106
107impl Watcher {
108    pub fn new( stub: WatchStub, watch_api: WatchApi, rx: mpsc::Receiver<Notification> ) -> Self {
109        Self{
110            stub,
111            watch_api,
112            rx
113        }
114    }
115}
116
117
118impl Drop for Watcher {
119    fn drop(&mut self) {
120        self.watch_api.un_listen(self.stub.clone());
121        self.rx.close();
122    }
123}