yozuk_sdk/
args.rs

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}