crates/flotilla-resources/src/watch.rs
Line | Count | Source |
1 | | use futures::stream::BoxStream; |
2 | | use serde::{de::DeserializeOwned, Deserialize, Serialize}; |
3 | | |
4 | | use crate::{ |
5 | | error::ResourceError, |
6 | | resource::{Resource, ResourceObject}, |
7 | | }; |
8 | | |
9 | | pub type WatchStream<T> = BoxStream<'static, Result<WatchEvent<T>, ResourceError>>; |
10 | | |
11 | | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] |
12 | | pub enum WatchStart { |
13 | | /// Deliver future events only. No replay of current state. |
14 | | Now, |
15 | | /// Resume from a specific version, delivering all events since that point. |
16 | | FromVersion(String), |
17 | | } |
18 | | |
19 | | #[derive(Debug, Clone, Serialize, Deserialize)] |
20 | | #[serde(bound( |
21 | | serialize = "T::Spec: Serialize, T::Status: Serialize", |
22 | | deserialize = "T::Spec: DeserializeOwned, T::Status: DeserializeOwned" |
23 | | ))] |
24 | | pub enum WatchEvent<T: Resource> { |
25 | | Added(ResourceObject<T>), |
26 | | Modified(ResourceObject<T>), |
27 | | Deleted(ResourceObject<T>), |
28 | | } |
29 | | |
30 | | #[derive(Debug, Clone, Serialize, Deserialize)] |
31 | | #[serde(bound( |
32 | | serialize = "T::Spec: Serialize, T::Status: Serialize", |
33 | | deserialize = "T::Spec: DeserializeOwned, T::Status: DeserializeOwned" |
34 | | ))] |
35 | | pub struct ResourceList<T: Resource> { |
36 | | pub items: Vec<ResourceObject<T>>, |
37 | | pub resource_version: String, |
38 | | } |
39 | | |
40 | | #[cfg(test)] |
41 | | mod tests { |
42 | | use super::WatchStart; |
43 | | |
44 | | #[test] |
45 | 1 | fn watch_start_roundtrips_through_serde() { |
46 | 1 | let encoded = serde_json::to_string(&WatchStart::FromVersion("7".to_string())).expect("serialize watch start"); |
47 | 1 | let decoded: WatchStart = serde_json::from_str(&encoded).expect("deserialize watch start"); |
48 | 1 | assert_eq!(decoded, WatchStart::FromVersion("7".to_string())); |
49 | 1 | } |
50 | | } |