fred/commands/impls/
sets.rs1use super::*;
2use crate::{
3 protocol::{command::CommandKind, utils as protocol_utils},
4 types::*,
5 utils,
6};
7use std::convert::TryInto;
8
9pub async fn sadd<C: ClientLike>(client: &C, key: Key, members: MultipleValues) -> Result<Value, Error> {
10 let frame = utils::request_response(client, move || {
11 let members = members.into_multiple_values();
12 let mut args = Vec::with_capacity(1 + members.len());
13 args.push(key.into());
14
15 for member in members.into_iter() {
16 args.push(member);
17 }
18 Ok((CommandKind::Sadd, args))
19 })
20 .await?;
21
22 protocol_utils::frame_to_results(frame)
23}
24
25pub async fn scard<C: ClientLike>(client: &C, key: Key) -> Result<Value, Error> {
26 one_arg_value_cmd(client, CommandKind::Scard, key.into()).await
27}
28
29pub async fn sdiff<C: ClientLike>(client: &C, keys: MultipleKeys) -> Result<Value, Error> {
30 let frame = utils::request_response(client, move || {
31 let mut args = Vec::with_capacity(keys.len());
32
33 for key in keys.inner().into_iter() {
34 args.push(key.into());
35 }
36 Ok((CommandKind::Sdiff, args))
37 })
38 .await?;
39
40 protocol_utils::frame_to_results(frame)
41}
42
43pub async fn sdiffstore<C: ClientLike>(client: &C, dest: Key, keys: MultipleKeys) -> Result<Value, Error> {
44 let frame = utils::request_response(client, move || {
45 let mut args = Vec::with_capacity(1 + keys.len());
46 args.push(dest.into());
47
48 for key in keys.inner().into_iter() {
49 args.push(key.into());
50 }
51 Ok((CommandKind::Sdiffstore, args))
52 })
53 .await?;
54
55 protocol_utils::frame_to_results(frame)
56}
57
58pub async fn sinter<C: ClientLike>(client: &C, keys: MultipleKeys) -> Result<Value, Error> {
59 let frame = utils::request_response(client, move || {
60 let mut args = Vec::with_capacity(keys.len());
61
62 for key in keys.inner().into_iter() {
63 args.push(key.into());
64 }
65 Ok((CommandKind::Sinter, args))
66 })
67 .await?;
68
69 protocol_utils::frame_to_results(frame)
70}
71
72pub async fn sinterstore<C: ClientLike>(client: &C, dest: Key, keys: MultipleKeys) -> Result<Value, Error> {
73 let frame = utils::request_response(client, move || {
74 let mut args = Vec::with_capacity(1 + keys.len());
75 args.push(dest.into());
76
77 for key in keys.inner().into_iter() {
78 args.push(key.into());
79 }
80 Ok((CommandKind::Sinterstore, args))
81 })
82 .await?;
83
84 protocol_utils::frame_to_results(frame)
85}
86
87pub async fn sismember<C: ClientLike>(client: &C, key: Key, member: Value) -> Result<Value, Error> {
88 args_value_cmd(client, CommandKind::Sismember, vec![key.into(), member]).await
89}
90
91pub async fn smismember<C: ClientLike>(client: &C, key: Key, members: MultipleValues) -> Result<Value, Error> {
92 let frame = utils::request_response(client, move || {
93 let members = members.into_multiple_values();
94 let mut args = Vec::with_capacity(1 + members.len());
95 args.push(key.into());
96
97 for member in members.into_iter() {
98 args.push(member);
99 }
100 Ok((CommandKind::Smismember, args))
101 })
102 .await?;
103
104 protocol_utils::frame_to_results(frame)
105}
106
107pub async fn smembers<C: ClientLike>(client: &C, key: Key) -> Result<Value, Error> {
108 one_arg_values_cmd(client, CommandKind::Smembers, key.into()).await
109}
110
111pub async fn smove<C: ClientLike>(client: &C, source: Key, dest: Key, member: Value) -> Result<Value, Error> {
112 let args = vec![source.into(), dest.into(), member];
113 args_value_cmd(client, CommandKind::Smove, args).await
114}
115
116pub async fn spop<C: ClientLike>(client: &C, key: Key, count: Option<usize>) -> Result<Value, Error> {
117 let frame = utils::request_response(client, move || {
118 let mut args = Vec::with_capacity(2);
119 args.push(key.into());
120
121 if let Some(count) = count {
122 args.push(count.try_into()?);
123 }
124 Ok((CommandKind::Spop, args))
125 })
126 .await?;
127
128 protocol_utils::frame_to_results(frame)
129}
130
131pub async fn srandmember<C: ClientLike>(client: &C, key: Key, count: Option<usize>) -> Result<Value, Error> {
132 let frame = utils::request_response(client, move || {
133 let mut args = Vec::with_capacity(2);
134 args.push(key.into());
135
136 if let Some(count) = count {
137 args.push(count.try_into()?);
138 }
139 Ok((CommandKind::Srandmember, args))
140 })
141 .await?;
142
143 protocol_utils::frame_to_results(frame)
144}
145
146pub async fn srem<C: ClientLike>(client: &C, key: Key, members: MultipleValues) -> Result<Value, Error> {
147 let frame = utils::request_response(client, move || {
148 let members = members.into_multiple_values();
149 let mut args = Vec::with_capacity(1 + members.len());
150 args.push(key.into());
151
152 for member in members.into_iter() {
153 args.push(member);
154 }
155 Ok((CommandKind::Srem, args))
156 })
157 .await?;
158
159 protocol_utils::frame_to_results(frame)
160}
161
162pub async fn sunion<C: ClientLike>(client: &C, keys: MultipleKeys) -> Result<Value, Error> {
163 let frame = utils::request_response(client, move || {
164 let mut args = Vec::with_capacity(keys.len());
165
166 for key in keys.inner().into_iter() {
167 args.push(key.into());
168 }
169 Ok((CommandKind::Sunion, args))
170 })
171 .await?;
172
173 protocol_utils::frame_to_results(frame)
174}
175
176pub async fn sunionstore<C: ClientLike>(client: &C, dest: Key, keys: MultipleKeys) -> Result<Value, Error> {
177 let frame = utils::request_response(client, move || {
178 let mut args = Vec::with_capacity(1 + keys.len());
179 args.push(dest.into());
180
181 for key in keys.inner().into_iter() {
182 args.push(key.into());
183 }
184 Ok((CommandKind::Sunionstore, args))
185 })
186 .await?;
187
188 protocol_utils::frame_to_results(frame)
189}