1use crate::serde_bytes::{deserialize_bytes_vec, serialize_bytes_vec};
2use bytes::Bytes;
3use serde_derive::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq, Hash)]
6pub struct CommandArgs {
7 pub args: Vec<String>,
8
9 #[serde(
10 serialize_with = "serialize_bytes_vec",
11 deserialize_with = "deserialize_bytes_vec"
12 )]
13 pub data: Vec<Bytes>,
14}
15
16impl CommandArgs {
17 pub fn new() -> Self {
18 Default::default()
19 }
20
21 pub fn bytes_len(&self) -> usize {
22 self.args.iter().fold(0, |acc, arg| acc + arg.len())
23 + self.data.iter().fold(0, |acc, data| acc + data.len())
24 }
25
26 pub fn add_args<T>(mut self, item: T) -> Self
27 where
28 T: IntoArgs<String>,
29 {
30 self.args.append(&mut item.into_args());
31 self
32 }
33
34 pub fn add_args_iter<T, I>(mut self, iter: I) -> Self
35 where
36 T: Into<String>,
37 I: IntoIterator<Item = T>,
38 {
39 self.args
40 .append(&mut iter.into_iter().map(Into::into).collect());
41 self
42 }
43
44 pub fn add_data<T>(mut self, item: T) -> Self
45 where
46 T: IntoArgs<Bytes>,
47 {
48 self.data.append(&mut item.into_args());
49 self
50 }
51
52 pub fn add_data_iter<T, I>(mut self, iter: I) -> Self
53 where
54 T: Into<Bytes>,
55 I: IntoIterator<Item = T>,
56 {
57 self.data
58 .append(&mut iter.into_iter().map(Into::into).collect());
59 self
60 }
61}
62
63impl<T> FromIterator<T> for CommandArgs
64where
65 T: Into<String>,
66{
67 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
68 Self {
69 args: iter.into_iter().map(Into::into).collect(),
70 data: vec![],
71 }
72 }
73}
74
75pub trait IntoArgs<T> {
76 fn into_args(self) -> Vec<T>;
77}
78
79impl<const N: usize, T> IntoArgs<String> for [T; N]
80where
81 T: Into<String>,
82{
83 fn into_args(self) -> Vec<String> {
84 self.into_iter().map(Into::into).collect()
85 }
86}
87
88impl<const N: usize, T> IntoArgs<String> for Option<[T; N]>
89where
90 T: Into<String>,
91{
92 fn into_args(self) -> Vec<String> {
93 if let Some(args) = self {
94 args.into_iter().map(Into::into).collect()
95 } else {
96 vec![]
97 }
98 }
99}
100
101impl<const N: usize, T> IntoArgs<Bytes> for [T; N]
102where
103 T: Into<Bytes>,
104{
105 fn into_args(self) -> Vec<Bytes> {
106 self.into_iter().map(Into::into).collect()
107 }
108}
109
110impl<const N: usize, T> IntoArgs<Bytes> for Option<[T; N]>
111where
112 T: Into<Bytes>,
113{
114 fn into_args(self) -> Vec<Bytes> {
115 if let Some(args) = self {
116 args.into_iter().map(Into::into).collect()
117 } else {
118 vec![]
119 }
120 }
121}