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
use crate::{
    cmd,
    resp::{BulkString, FromValue},
    Database, Result, IntoArgs,
};
use async_trait::async_trait;

/// A group of Redis commands related to Lists
///
/// # See Also
/// [Redis List Commands](https://redis.io/commands/?group=list)
#[async_trait]
pub trait ListCommands {
    /// 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/)
    async fn lpush<K, E>(&self, key: K, elements: E) -> Result<i64>
    where
        K: Into<BulkString> + Send,
        E: IntoArgs + Send;

    /// 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/)
    async fn lpop<K, E>(&self, key: K, count: usize) -> Result<Vec<E>>
    where
        K: Into<BulkString> + Send,
        E: FromValue;
}

#[async_trait]
impl ListCommands for Database {
    async fn lpush<K, E>(&self, key: K, elements: E) -> Result<i64>
    where
        K: Into<BulkString> + Send,
        E: IntoArgs + Send,
    {
        self.send(cmd("LPUSH").arg(key).args(elements)).await?.into()
    }

    async fn lpop<K, E>(&self, key: K, count: usize) -> Result<Vec<E>>
    where
        K: Into<BulkString> + Send,
        E: FromValue,
    {
        self.send(cmd("LPOP").arg(key).arg(count)).await?.into()
    }
}