1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//! The module describes all possible replies from MPD server.
//!
//! Also it contains most generic parser, which can handle
//! all possible server replies.

use std::str::FromStr;

use error::{ParseError, ServerError};

/// All possible MPD server replies
#[derive(Debug, Clone, PartialEq)]
pub enum Reply {
    /// `OK` and `list_OK` replies
    Ok,
    /// `ACK` reply (server error)
    Ack(ServerError),
    /// a data pair reply (in `field: value` format)
    Pair(String, String),
}

impl FromStr for Reply {
    type Err = ParseError;
    fn from_str(s: &str) -> Result<Reply, ParseError> {
        if s == "OK" || s == "list_OK" {
            Ok(Reply::Ok)
        } else {
            if let Ok(ack) = s.parse::<ServerError>() {
                Ok(Reply::Ack(ack))
            } else {
                let mut splits = s.splitn(2, ':');
                match (splits.next(), splits.next()) {
                    (Some(a), Some(b)) => Ok(Reply::Pair(a.to_owned(), b.trim().to_owned())),
                    _ => Err(ParseError::BadPair),
                }
            }
        }
    }
}