Coverage Report

Created: 2026-05-19 10:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
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
}