1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use crate::{
    cmd,
    resp::{BulkString, FromValue},
    CommandSend, IntoArgs, Result,
};
use futures::Future;
use std::pin::Pin;

/// A group of Redis commands related to Lists
///
/// # See Also
/// [Redis List Commands](https://redis.io/commands/?group=list)
pub trait ListCommands: CommandSend {
    /// Insert all the specified values at the head of the list stored at key
    ///
    /// # Return
    /// the length of the list after the push operations.
    ///
    /// # See Also
    /// [https://redis.io/commands/lpush/](https://redis.io/commands/lpush/)
    fn lpush<K, E>(&self, key: K, elements: E) -> Pin<Box<dyn Future<Output = Result<i64>> + '_>>
    where
        K: Into<BulkString> + Send,
        E: IntoArgs + Send,
    {
        self.send_into(cmd("LPUSH").arg(key).args(elements))
    }

    /// Removes and returns the first elements of the list stored at key.
    ///
    /// # Return
    /// collection of popped elements, or empty collection when key does not exist.
    ///
    /// # See Also
    /// [https://redis.io/commands/lpop/](https://redis.io/commands/lpop/)
    fn lpop<K, E>(&self, key: K, count: usize) -> Pin<Box<dyn Future<Output = Result<Vec<E>>> + '_>>
    where
        K: Into<BulkString> + Send,
        E: FromValue,
    {
        self.send_into(cmd("LPOP").arg(key).arg(count))
    }

    /// Insert all the specified values at the tail of the list stored at key
    ///
    /// # Return
    /// the length of the list after the push operations.
    ///
    /// # See Also
    /// [https://redis.io/commands/lpush/](https://redis.io/commands/rpush/)
    fn rpush<K, E>(&self, key: K, elements: E) -> Pin<Box<dyn Future<Output = Result<i64>> + '_>>
    where
        K: Into<BulkString> + Send,
        E: IntoArgs + Send,
    {
        self.send_into(cmd("RPUSH").arg(key).args(elements))
    }

    /// Removes and returns the first elements of the list stored at key.
    ///
    /// # Return
    /// collection of popped elements, or empty collection when key does not exist.
    ///
    /// # See Also
    /// [https://redis.io/commands/lpop/](https://redis.io/commands/rpop/)
    fn rpop<K, E>(&self, key: K, count: usize) -> Pin<Box<dyn Future<Output = Result<Vec<E>>> + '_>>
    where
        K: Into<BulkString> + Send,
        E: FromValue,
    {
        self.send_into(cmd("RPOP").arg(key).arg(count))
    }
}