kade_proto/cmd/
mod.rs

1mod dump;
2mod get;
3mod load;
4mod ping;
5mod publish;
6mod set;
7mod subscribe;
8mod unknown;
9mod version;
10
11pub use dump::Dump;
12pub use get::Get;
13pub use load::Load;
14pub use ping::Ping;
15pub use publish::Publish;
16pub use set::Set;
17pub use subscribe::{Subscribe, Unsubscribe};
18pub use unknown::Unknown;
19pub use version::Version;
20
21use crate::prelude::*;
22
23#[derive(Debug)]
24pub enum Command {
25    Get(Get),
26    Publish(Publish),
27    Set(Set),
28    Subscribe(Subscribe),
29    Unsubscribe(Unsubscribe),
30    Ping(Ping),
31    Version(Version),
32    Dump(Dump),
33    Load(Load),
34    Unknown(Unknown),
35}
36
37impl Command {
38    pub fn from_frame(frame: Frame) -> crate::Result<Command> {
39        let mut parse = Parse::new(frame)?;
40        let command_name = parse.next_string()?.to_lowercase();
41
42        let command = match &command_name[..] {
43            "get" => Command::Get(Get::parse_frames(&mut parse)?),
44            "publish" => Command::Publish(Publish::parse_frames(&mut parse)?),
45            "set" => Command::Set(Set::parse_frames(&mut parse)?),
46            "subscribe" => Command::Subscribe(Subscribe::parse_frames(&mut parse)?),
47            "unsubscribe" => Command::Unsubscribe(Unsubscribe::parse_frames(&mut parse)?),
48            "ping" => Command::Ping(Ping::parse_frames(&mut parse)?),
49            "version" => Command::Version(Version::parse_frames(&mut parse)?),
50            "dump" => Command::Dump(Dump::parse_frames(&mut parse)?),
51            "load" => Command::Load(Load::parse_frames(&mut parse)?),
52            _ => return Ok(Command::Unknown(Unknown::new(command_name))),
53        };
54
55        parse.finish()?;
56        Ok(command)
57    }
58
59    pub async fn apply(self, db: &Db, dst: &mut Connection, shutdown: &mut Shutdown) -> crate::Result<()> {
60        use Command::*;
61
62        match self {
63            Get(cmd) => cmd.apply(db, dst).await,
64            Publish(cmd) => cmd.apply(db, dst).await,
65            Set(cmd) => cmd.apply(db, dst).await,
66            Subscribe(cmd) => cmd.apply(db, dst, shutdown).await,
67            Ping(cmd) => cmd.apply(dst).await,
68            Version(cmd) => cmd.apply(dst).await,
69            Dump(cmd) => cmd.apply(db, dst).await,
70            Load(cmd) => cmd.apply(db, dst).await,
71            Unknown(cmd) => cmd.apply(dst).await,
72            Unsubscribe(_) => Err("`Unsubscribe` is unsupported in this context".into()),
73        }
74    }
75
76    pub fn get_name(&self) -> &str {
77        match self {
78            Command::Get(_) => "get",
79            Command::Publish(_) => "pub",
80            Command::Set(_) => "set",
81            Command::Subscribe(_) => "subscribe",
82            Command::Unsubscribe(_) => "unsubscribe",
83            Command::Ping(_) => "ping",
84            Command::Version(_) => "version",
85            Command::Dump(_) => "dump",
86            Command::Load(_) => "load",
87            Command::Unknown(cmd) => cmd.get_name(),
88        }
89    }
90}