fn try_from()

in src/protocol/resp/src/request/badd.rs [38:82]


    fn try_from(other: Message) -> Result<Self, Error> {
        if let Message::Array(array) = other {
            if array.inner.is_none() {
                return Err(Error::new(ErrorKind::Other, "malformed command"));
            }

            let mut array = array.inner.unwrap();

            if array.len() < 4 {
                return Err(Error::new(ErrorKind::Other, "malformed command"));
            }

            if array.len() % 2 == 1 {
                return Err(Error::new(ErrorKind::Other, "malformed command"));
            }

            let outer_key = take_bulk_string(&mut array)?;
            if outer_key.is_empty() {
                return Err(Error::new(ErrorKind::Other, "malformed command"));
            }

            //loop as long as we have at least 2 arguments after the command
            let mut pairs = Vec::with_capacity(array.len() / 2);
            while array.len() >= 3 {
                let inner_key = take_bulk_string(&mut array)?;
                if inner_key.is_empty() {
                    return Err(Error::new(ErrorKind::Other, "malformed command"));
                }

                let value = take_bulk_string(&mut array)?;
                if value.is_empty() {
                    return Err(Error::new(ErrorKind::Other, "malformed command"));
                }

                pairs.push((inner_key, value));
            }

            Ok(Self {
                outer_key,
                inner_key_value_pairs: Arc::new(Box::<[ArcKeyValuePair]>::from(pairs)),
            })
        } else {
            Err(Error::new(ErrorKind::Other, "malformed command"))
        }
    }