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 pub fn builder<V: Into<String>>(version: V) -> NodeUpdateOptsBuilder {
36 NodeUpdateOptsBuilder::new(version)
37 }
38
39 impl_map_field!(json
40 labels => "Labels"
42 );
43
44 impl_str_field!(
45 name => "Name"
47 );
48
49 impl_str_enum_field!(
50 role: NodeSpecRoleInlineItem => "Role"
52 );
53
54 impl_str_enum_field!(
55 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
87pub enum NodeFilter {
89 Id(String),
90 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}