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
use crate::{
    resp::{cmd, BulkString},
    CommandResult, PrepareCommand,
};

/// A group of Redis commands related to Sentinel
/// # See Also
/// [Sentinel Commands](https://redis.io/docs/manual/sentinel/#sentinel-commands)
pub trait SentinelCommands<T>: PrepareCommand<T> {
    /// Return the ip and port number of the master with that name.
    ///
    /// If a failover is in progress or terminated successfully for this master,
    /// it returns the address and port of the promoted replica.
    ///
    /// # Return
    /// * `None` if sentinel does not know this master
    /// * A tuple made up of
    ///     * The IP of the master
    ///     * The port of the master
    #[must_use]
    fn sentinel_get_master_addr_by_name<N>(
        &self,
        master_name: N,
    ) -> CommandResult<T, Option<(String, u16)>>
    where
        N: Into<BulkString>,
    {
        self.prepare_command(
            cmd("SENTINEL")
                .arg("GET-MASTER-ADDR-BY-NAME")
                .arg(master_name),
        )
    }

    /// Force a failover as if the master was not reachable, 
    /// and without asking for agreement to other Sentinels 
    /// (however a new version of the configuration will be published 
    /// so that the other Sentinels will update their configurations).
    #[must_use]
    fn sentinel_failover<N>(&self, master_name: N) -> CommandResult<T, ()>
    where
        N: Into<BulkString>,
    {
        self.prepare_command(
            cmd("SENTINEL")
                .arg("FAILOVER")
                .arg(master_name),
        )
    }
}