embedded_redis/commands/
hello.rs1use crate::commands::helpers::{CmdStr, RespMap};
34use crate::commands::{Command, ResponseTypeError};
35use alloc::string::String;
36use alloc::vec::Vec;
37use redis_protocol::resp2::types::BytesFrame as Resp2Frame;
38use redis_protocol::resp3::types::{BytesFrame as Resp3Frame, RespVersion};
39
40pub struct HelloCommand {}
42
43impl Command<Resp3Frame> for HelloCommand {
44 type Response = HelloResponse;
45
46 fn encode(&self) -> Resp3Frame {
47 Resp3Frame::Hello {
48 version: RespVersion::RESP3,
49 auth: None,
50 setname: None,
51 }
52 }
53
54 fn eval_response(&self, frame: Resp3Frame) -> Result<Self::Response, ResponseTypeError> {
55 HelloResponse::try_from(frame)
56 }
57}
58
59impl Command<Resp2Frame> for HelloCommand {
60 type Response = HelloResponse;
61
62 fn encode(&self) -> Resp2Frame {
63 unimplemented!("Command requires RESP3");
64 }
65
66 fn eval_response(&self, _frame: Resp2Frame) -> Result<Self::Response, ResponseTypeError> {
67 unimplemented!("Command requires RESP3");
68 }
69}
70
71#[derive(Debug)]
73pub struct HelloResponse {
74 pub server: String,
75 pub version: String,
76 pub protocol: i64,
77 pub id: i64,
78 pub mode: String,
79 pub role: String,
80 pub modules: Vec<Resp3Frame>,
81}
82
83impl TryFrom<Resp3Frame> for HelloResponse {
84 type Error = ResponseTypeError;
85
86 fn try_from(frame: Resp3Frame) -> Result<Self, Self::Error> {
87 let map = match frame {
88 Resp3Frame::Map { data, attributes: _ } => data,
89 _ => return Err(ResponseTypeError {}),
90 };
91
92 let map_cmd = RespMap::new(&map);
93
94 Ok(HelloResponse {
95 server: map_cmd.find_string("server").ok_or(ResponseTypeError {})?,
96 version: map_cmd.find_string("version").ok_or(ResponseTypeError {})?,
97 protocol: map_cmd.find_integer("proto").ok_or(ResponseTypeError {})?,
98 id: map_cmd.find_integer("id").ok_or(ResponseTypeError {})?,
99 mode: map_cmd.find_string("mode").ok_or(ResponseTypeError {})?,
100 role: map_cmd.find_string("role").ok_or(ResponseTypeError {})?,
101 modules: match map.get(&CmdStr::new("modules").to_blob()).ok_or(ResponseTypeError {})? {
102 Resp3Frame::Array { data, attributes: _ } => data.clone(),
103 _ => return Err(ResponseTypeError {}),
104 },
105 })
106 }
107}