From 84aacd0020c1abd22dc743e230bf86fae4018843 Mon Sep 17 00:00:00 2001 From: Takeru Ohta Date: Tue, 13 Feb 2018 00:44:07 +0900 Subject: [PATCH] Add `value` module --- src/value.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/value.rs diff --git a/src/value.rs b/src/value.rs new file mode 100644 index 0000000..2aa8753 --- /dev/null +++ b/src/value.rs @@ -0,0 +1,38 @@ +use std::fmt; +use std::str::FromStr; +use trackable::error::ErrorKindExt; + +use {Error, ErrorKind, Result}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct ByteRange { + pub length: usize, + pub start: Option, +} +impl fmt::Display for ByteRange { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.length)?; + if let Some(x) = self.start { + write!(f, "@{}", x)?; + } + Ok(()) + } +} +impl FromStr for ByteRange { + type Err = Error; + fn from_str(s: &str) -> Result { + let mut tokens = s.splitn(2, '@'); + let length = tokens.next().expect("Never fails"); + let start = if let Some(start) = tokens.next() { + Some(track!( + start.parse().map_err(|e| ErrorKind::InvalidInput.cause(e)) + )?) + } else { + None + }; + Ok(ByteRange { + length: track!(length.parse().map_err(|e| ErrorKind::InvalidInput.cause(e)))?, + start, + }) + } +}