kube_core/
watch.rs

1//! Types for the watch api
2//!
3//! See <https://kubernetes.io/docs/reference/using-api/api-concepts/#efficient-detection-of-changes>
4
5use crate::{error::ErrorResponse, metadata::TypeMeta};
6use serde::{Deserialize, Serialize};
7use std::fmt::Debug;
8/// A raw event returned from a watch query
9///
10/// Note that a watch query returns many of these as newline separated JSON.
11#[derive(Deserialize, Serialize, Clone)]
12#[serde(tag = "type", content = "object", rename_all = "UPPERCASE")]
13pub enum WatchEvent<K> {
14    /// Resource was added
15    Added(K),
16    /// Resource was modified
17    Modified(K),
18    /// Resource was deleted
19    Deleted(K),
20    /// Resource bookmark. `Bookmark` is a slimmed down `K` due to [#285](https://github.com/kube-rs/kube/issues/285).
21    ///
22    /// From [Watch bookmarks](https://kubernetes.io/docs/reference/using-api/api-concepts/#watch-bookmarks).
23    ///
24    /// NB: This became Beta first in Kubernetes 1.16.
25    Bookmark(Bookmark),
26    /// There was some kind of error
27    Error(ErrorResponse),
28}
29
30impl<K> Debug for WatchEvent<K> {
31    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
32        match &self {
33            WatchEvent::Added(_) => write!(f, "Added event"),
34            WatchEvent::Modified(_) => write!(f, "Modified event"),
35            WatchEvent::Deleted(_) => write!(f, "Deleted event"),
36            WatchEvent::Bookmark(_) => write!(f, "Bookmark event"),
37            WatchEvent::Error(e) => write!(f, "Error event: {e:?}"),
38        }
39    }
40}
41
42/// Slimed down K for [`WatchEvent::Bookmark`] due to [#285](https://github.com/kube-rs/kube/issues/285).
43///
44/// Can only be relied upon to have metadata with resource version.
45/// Bookmarks contain apiVersion + kind + basically empty metadata.
46#[derive(Serialize, Deserialize, Clone)]
47pub struct Bookmark {
48    /// apiVersion + kind
49    #[serde(flatten)]
50    pub types: TypeMeta,
51
52    /// Basically empty metadata
53    pub metadata: BookmarkMeta,
54}
55
56/// Slimed down Metadata for WatchEvent::Bookmark
57#[derive(Serialize, Deserialize, Clone)]
58#[serde(rename_all = "camelCase")]
59pub struct BookmarkMeta {
60    /// The only field we need from a Bookmark event.
61    pub resource_version: String,
62
63    /// Kubernetes 1.27 Streaming Lists
64    /// The rest of the fields are optional and may be empty.
65    #[serde(default)]
66    pub annotations: std::collections::BTreeMap<String, String>,
67}