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}