diff options
| author | Jakob L. Kreuze <zerodaysfordays@sdf.org> | 2022-08-07 20:47:54 -0400 |
|---|---|---|
| committer | Jakob L. Kreuze <zerodaysfordays@sdf.org> | 2022-08-07 20:47:54 -0400 |
| commit | ea77a8cf9c012fcd877d842fec85b0b5a442952c (patch) | |
| tree | 7f209c030b97a957497f152d161a9d7035311132 /vendored/mpd/src/reply.rs | |
| parent | 0de7e9ac43f88aae3750ecfe25b5454fdd1ad015 (diff) | |
Diffstat (limited to 'vendored/mpd/src/reply.rs')
| -rw-r--r-- | vendored/mpd/src/reply.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/vendored/mpd/src/reply.rs b/vendored/mpd/src/reply.rs new file mode 100644 index 0000000..b288259 --- /dev/null +++ b/vendored/mpd/src/reply.rs @@ -0,0 +1,36 @@ +//! The module describes all possible replies from MPD server. +//! +//! Also it contains most generic parser, which can handle +//! all possible server replies. + + +use crate::error::{ParseError, ServerError}; +use std::str::FromStr; + +/// 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), + } + } + } +} |