lib.rs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. #[macro_use]
  2. mod macros;
  3. use std::convert::TryInto;
  4. #[derive(Debug, PartialEq, Clone)]
  5. pub enum Value<'a> {
  6. Array(Vec<Value<'a>>),
  7. Blob(&'a [u8]),
  8. String(&'a str),
  9. Error(&'a str, &'a str),
  10. Integer(i64),
  11. Boolean(bool),
  12. Float(f64),
  13. BigInteger(i128),
  14. Null,
  15. }
  16. #[derive(Debug, Clone, Eq, PartialEq)]
  17. pub enum Error {
  18. Partial,
  19. InvalidPrefix,
  20. InvalidLength,
  21. InvalidBoolean,
  22. InvalidNumber,
  23. Protocol(u8, u8),
  24. NewLine,
  25. }
  26. pub fn parse_server(bytes: &[u8]) -> Result<(&[u8], Vec<&[u8]>), Error> {
  27. let (bytes, byte) = next!(bytes);
  28. match byte {
  29. b'*' => parse_server_array(bytes),
  30. _ => Err(Error::Protocol(b'*', byte)),
  31. }
  32. }
  33. fn parse_server_array(bytes: &[u8]) -> Result<(&[u8], Vec<&[u8]>), Error> {
  34. let (bytes, len) = read_line_number!(bytes, i32);
  35. if len <= 0 {
  36. return Err(Error::Protocol(b'x', b'y'));
  37. }
  38. let mut v = vec![];
  39. let mut bytes = bytes;
  40. for _i in 0..len {
  41. let n = next!(bytes);
  42. let r = match n.1 {
  43. b'$' => parse_blob(n.0),
  44. _ => Err(Error::Protocol(b'$', n.1)),
  45. }?;
  46. bytes = r.0;
  47. v.push(match r.1 {
  48. Value::Blob(x) => Ok(x),
  49. _ => Err(Error::Protocol(b'x', b'y')),
  50. }?);
  51. }
  52. Ok((bytes, v))
  53. }
  54. pub fn parse(bytes: &[u8]) -> Result<(&[u8], Value), Error> {
  55. let (bytes, byte) = next!(bytes);
  56. match byte {
  57. b'*' => parse_array(bytes),
  58. b'$' => parse_blob(bytes),
  59. b':' => parse_integer(bytes),
  60. b'(' => parse_big_integer(bytes),
  61. b',' => parse_float(bytes),
  62. b'#' => parse_boolean(bytes),
  63. b'+' => parse_str(bytes),
  64. b'-' => parse_error(bytes),
  65. _ => Err(Error::InvalidPrefix),
  66. }
  67. }
  68. fn parse_error(bytes: &[u8]) -> Result<(&[u8], Value), Error> {
  69. let (bytes, err_type) = read_until!(bytes, b' ');
  70. let (bytes, str) = read_line!(bytes);
  71. let err_type = unsafe { std::str::from_utf8_unchecked(err_type) };
  72. let str = unsafe { std::str::from_utf8_unchecked(str) };
  73. ret!(bytes, Value::Error(err_type, str))
  74. }
  75. fn parse_str(bytes: &[u8]) -> Result<(&[u8], Value), Error> {
  76. let (bytes, str) = read_line!(bytes);
  77. let str = unsafe { std::str::from_utf8_unchecked(str) };
  78. ret!(bytes, Value::String(str))
  79. }
  80. fn parse_boolean(bytes: &[u8]) -> Result<(&[u8], Value), Error> {
  81. let (bytes, byte) = next!(bytes);
  82. let v = match byte {
  83. b't' => true,
  84. b'f' => false,
  85. _ => return Err(Error::InvalidBoolean),
  86. };
  87. ret!(bytes, Value::Boolean(v))
  88. }
  89. fn parse_big_integer(bytes: &[u8]) -> Result<(&[u8], Value), Error> {
  90. let (bytes, number) = read_line_number!(bytes, i128);
  91. ret!(bytes, Value::BigInteger(number))
  92. }
  93. fn parse_integer(bytes: &[u8]) -> Result<(&[u8], Value), Error> {
  94. let (bytes, number) = read_line_number!(bytes, i64);
  95. ret!(bytes, Value::Integer(number))
  96. }
  97. fn parse_float(bytes: &[u8]) -> Result<(&[u8], Value), Error> {
  98. let (bytes, number) = read_line_number!(bytes, f64);
  99. ret!(bytes, Value::Float(number))
  100. }
  101. fn parse_blob(bytes: &[u8]) -> Result<(&[u8], Value), Error> {
  102. let (bytes, len) = read_line_number!(bytes, i32);
  103. if len <= 0 {
  104. return ret!(bytes, Value::Null);
  105. }
  106. let (bytes, blob) = read_len!(bytes, len);
  107. let bytes = assert_nl!(bytes);
  108. ret!(bytes, Value::Blob(blob))
  109. }
  110. fn parse_array(bytes: &[u8]) -> Result<(&[u8], Value), Error> {
  111. let (bytes, len) = read_line_number!(bytes, i32);
  112. if len <= 0 {
  113. return ret!(bytes, Value::Null);
  114. }
  115. let mut v = vec![Value::Null; len as usize];
  116. let mut bytes = bytes;
  117. for i in 0..len {
  118. let r = parse(bytes)?;
  119. bytes = r.0;
  120. v[i as usize] = r.1;
  121. }
  122. ret!(bytes, Value::Array(v))
  123. }
  124. #[cfg(test)]
  125. mod test {
  126. use super::*;
  127. #[test]
  128. fn test_parse_partial() {
  129. let d = b"*-1";
  130. assert_eq!(Err(Error::Partial), parse(d));
  131. }
  132. #[test]
  133. fn test_parse_partial_2() {
  134. let d = b"*12\r\n";
  135. assert_eq!(Err(Error::Partial), parse(d));
  136. }
  137. #[test]
  138. fn test_incomplete_blob_parsing() {
  139. let d = b"$60\r\nfoobar\r\n";
  140. assert_eq!(Err(Error::Partial), parse(d));
  141. }
  142. #[test]
  143. fn test_complete_blob_parsing() {
  144. let d = b"$6\r\nfoobar\r\n";
  145. let r = parse(d);
  146. assert!(r.is_ok());
  147. let data = match r.unwrap().1 {
  148. Value::Blob(x) => unsafe { std::str::from_utf8_unchecked(x) },
  149. _ => "",
  150. };
  151. assert_eq!(data, "foobar");
  152. }
  153. #[test]
  154. fn test_complete_blob_parsing_and_extra_buffer() {
  155. let d = b"$6\r\nfoobar\r\n$6\r\nfoobar\r\n";
  156. let r = parse(d);
  157. assert!(r.is_ok());
  158. let (buf, data) = r.unwrap();
  159. let data = match data {
  160. Value::Blob(x) => unsafe { std::str::from_utf8_unchecked(x) },
  161. _ => "",
  162. };
  163. assert_eq!(data, "foobar");
  164. assert_eq!(b"$6\r\nfoobar\r\n", buf);
  165. }
  166. #[test]
  167. fn test_complete_array_parser() {
  168. let d = b"*2\r\n$6\r\nfoobar\r\n$3\r\nfoo\r\n";
  169. let r = parse(d);
  170. assert!(r.is_ok());
  171. let x = match r.unwrap().1 {
  172. Value::Array(x) => x,
  173. _ => panic!("Unxpected type"),
  174. };
  175. assert_eq!(2, x.len());
  176. }
  177. #[test]
  178. fn test_complete_nested_array_parser() {
  179. let d = b"*2\r\n$6\r\nfoobar\r\n*1\r\n$3\r\nfoo\r\n";
  180. let r = parse(d);
  181. assert!(r.is_ok());
  182. let x = match r.unwrap().1 {
  183. Value::Array(x) => x,
  184. _ => panic!("Unxpected type"),
  185. };
  186. assert_eq!(2, x.len());
  187. }
  188. #[test]
  189. fn test_parse_float() {
  190. let d = b",0.25887\r\n";
  191. let r = parse(d);
  192. assert!(r.is_ok());
  193. let x = match r.unwrap().1 {
  194. Value::Float(x) => x,
  195. _ => panic!("Unxpected type"),
  196. };
  197. assert_eq!(0.25887, x);
  198. }
  199. #[test]
  200. fn test_parse_integer() {
  201. let d = b":25887\r\n";
  202. let r = parse(d);
  203. assert!(r.is_ok());
  204. let x = match r.unwrap().1 {
  205. Value::Integer(x) => x,
  206. _ => panic!("Unxpected type"),
  207. };
  208. assert_eq!(25887, x);
  209. }
  210. #[test]
  211. fn test_parse_big_integer() {
  212. let d = b"(25887\r\n";
  213. let r = parse(d);
  214. assert!(r.is_ok());
  215. let x = match r.unwrap().1 {
  216. Value::BigInteger(x) => x,
  217. _ => panic!("Unxpected type"),
  218. };
  219. assert_eq!(25887, x);
  220. }
  221. #[test]
  222. fn test_parse_false() {
  223. let d = b"#f\r\n";
  224. let r = parse(d);
  225. assert!(r.is_ok());
  226. let x = match r.unwrap().1 {
  227. Value::Boolean(x) => x,
  228. _ => panic!("Unxpected type"),
  229. };
  230. assert!(!x);
  231. }
  232. #[test]
  233. fn test_parse_true() {
  234. let d = b"#t\r\n";
  235. let r = parse(d);
  236. assert!(r.is_ok());
  237. let x = match r.unwrap().1 {
  238. Value::Boolean(x) => x,
  239. _ => panic!("Unxpected type"),
  240. };
  241. assert!(x);
  242. }
  243. #[test]
  244. fn test_parse_boolean_unexpected() {
  245. let d = b"#1\r\n";
  246. assert_eq!(Err(Error::InvalidBoolean), parse(d));
  247. }
  248. #[test]
  249. fn test_parse_str() {
  250. let d = b"+hello world\r\n";
  251. let r = parse(d);
  252. assert!(r.is_ok());
  253. let x = match r.unwrap().1 {
  254. Value::String(x) => x,
  255. _ => panic!("Unxpected type"),
  256. };
  257. assert_eq!("hello world", x);
  258. }
  259. #[test]
  260. fn test_parse_error() {
  261. let d = b"-ERR this is the error description\r\n";
  262. let r = parse(d);
  263. assert!(r.is_ok());
  264. let x = match r.unwrap().1 {
  265. Value::Error(a, b) => (a, b),
  266. _ => panic!("Unxpected type"),
  267. };
  268. assert_eq!("ERR", x.0);
  269. assert_eq!("this is the error description", x.1);
  270. }
  271. }