docker_api/opts/
node.rs

1use crate::models::{NodeSpecAvailabilityInlineItem, NodeSpecRoleInlineItem};
2use crate::{Error, Result};
3use containers_api::opts::{Filter, FilterItem};
4use containers_api::{
5    impl_filter_func, impl_map_field, impl_opts_builder, impl_str_enum_field, impl_str_field,
6};
7
8use serde::Serialize;
9
10use std::collections::HashMap;
11
12#[derive(Serialize, Debug)]
13pub enum Membership {
14    Accepted,
15    Pending,
16}
17
18impl AsRef<str> for Membership {
19    fn as_ref(&self) -> &str {
20        match &self {
21            Membership::Accepted => "accepted",
22            Membership::Pending => "pending",
23        }
24    }
25}
26
27#[derive(Serialize, Debug)]
28pub struct NodeUpdateOpts {
29    version: String,
30    params: HashMap<&'static str, serde_json::Value>,
31}
32
33impl NodeUpdateOpts {
34    /// return a new instance of a builder for Opts
35    pub fn builder<V: Into<String>>(version: V) -> NodeUpdateOptsBuilder {
36        NodeUpdateOptsBuilder::new(version)
37    }
38
39    impl_map_field!(json
40        /// User-defined key/value metadata
41        labels => "Labels"
42    );
43
44    impl_str_field!(
45        /// Name for the node.
46        name => "Name"
47    );
48
49    impl_str_enum_field!(
50        /// Role of the node.
51        role: NodeSpecRoleInlineItem => "Role"
52    );
53
54    impl_str_enum_field!(
55        /// Availability of the node.
56        availability: NodeSpecAvailabilityInlineItem => "Availability"
57    );
58
59    pub fn serialize(&self) -> Result<String> {
60        serde_json::to_string(&self.params).map_err(Error::from)
61    }
62
63    pub fn serialize_vec(&self) -> Result<Vec<u8>> {
64        serde_json::to_vec(&self).map_err(Error::from)
65    }
66
67    pub fn version(&self) -> &str {
68        &self.version
69    }
70}
71
72#[derive(Serialize, Debug)]
73pub struct NodeUpdateOptsBuilder {
74    version: String,
75    params: HashMap<&'static str, serde_json::Value>,
76}
77
78impl NodeUpdateOptsBuilder {
79    pub fn new<V: Into<String>>(version: V) -> Self {
80        Self {
81            version: version.into(),
82            params: HashMap::new(),
83        }
84    }
85}
86
87/// Filter type used to filter nodes by one of the variants.
88pub enum NodeFilter {
89    Id(String),
90    /// The engine label
91    Label(String),
92    Membership(Membership),
93    Name(String),
94    NodeLabel(String),
95    Role(NodeSpecRoleInlineItem),
96}
97
98impl Filter for NodeFilter {
99    fn query_item(&self) -> FilterItem {
100        match &self {
101            NodeFilter::Id(id) => FilterItem::new("id", id.to_owned()),
102            NodeFilter::Label(label) => FilterItem::new("label", label.to_owned()),
103            NodeFilter::Membership(membership) => {
104                FilterItem::new("membership", membership.as_ref().to_string())
105            }
106            NodeFilter::Name(name) => FilterItem::new("name", name.to_owned()),
107            NodeFilter::NodeLabel(node) => FilterItem::new("node.label", node.to_owned()),
108            NodeFilter::Role(role) => FilterItem::new("role", role.as_ref().to_string()),
109        }
110    }
111}
112
113impl_opts_builder!(url => NodeList);
114
115impl NodeListOptsBuilder {
116    impl_filter_func!(NodeFilter);
117}