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