use kevy_resp::{
ArgvView, RespVersion, encode_array_len, encode_bulk, encode_error, encode_integer,
encode_map_header,
};
pub(crate) fn kevy_hello_reply<A: ArgvView + ?Sized>(
args: &A,
current_proto: RespVersion,
) -> (RespVersion, Vec<u8>) {
let new_proto = match args.get(1) {
None => current_proto,
Some(b"2") => RespVersion::V2,
Some(b"3") => RespVersion::V3,
Some(_) => {
let mut out = Vec::new();
encode_error(
&mut out,
"NOPROTO unsupported protocol version (kevy supports 2 and 3)",
);
return (current_proto, out);
}
};
let mut out = Vec::new();
encode_hello_reply(&mut out, new_proto);
(new_proto, out)
}
fn encode_hello_reply(out: &mut Vec<u8>, proto: RespVersion) {
let proto_int = match proto {
RespVersion::V2 => 2,
RespVersion::V3 => 3,
};
match proto {
RespVersion::V2 => encode_array_len(out, 14),
RespVersion::V3 => encode_map_header(out, 7),
}
encode_bulk(out, b"server");
encode_bulk(out, b"kevy");
encode_bulk(out, b"version");
encode_bulk(out, env!("CARGO_PKG_VERSION").as_bytes());
encode_bulk(out, b"proto");
encode_integer(out, proto_int);
encode_bulk(out, b"id");
encode_integer(out, 0);
encode_bulk(out, b"mode");
encode_bulk(out, b"standalone");
encode_bulk(out, b"role");
encode_bulk(out, b"master");
encode_bulk(out, b"modules");
encode_array_len(out, 0);
}