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}