Remove unused methods from Pig

This commit is contained in:
Dustin J. Mitchell
2018-11-12 09:39:59 -05:00
parent 1272acb893
commit 7fd94f6495
2 changed files with 32 additions and 132 deletions

View File

@@ -103,18 +103,15 @@ pub(super) fn parse_ff4(line: &str) -> Result<Task> {
let name = subpig.get_until(b':')?;
let name = str::from_utf8(name)?;
subpig.skip(b':')?;
if let Some(value) = subpig.get_quoted(b'"') {
let value = json_decode(value)?;
let value = decode(value);
builder = builder.set(name, value);
} else {
bail!("bad line 3");
}
let value = subpig.get_quoted(b'"')?;
let value = json_decode(value)?;
let value = decode(value);
builder = builder.set(name, value);
subpig.skip(b' ').ok(); // ignore if not found..
}
pig.skip(b']')?;
if !pig.depleted() {
bail!("bad line 5");
bail!("trailing characters on line");
}
Ok(builder.finish())
}

View File

@@ -1,5 +1,5 @@
//! A minimal implementation of the "Pig" parsing utility from the Taskwarrior
//! source.
//! source. This is just enough to parse FF4 lines.
use errors::*;
@@ -35,25 +35,12 @@ impl<'a> Pig<'a> {
Ok(rv)
}
// TODO: get_until_str
// TODO: get_until_one_of
// TODO: get_until_ws
pub fn get_until_eos(&mut self) -> Option<&'a [u8]> {
if self.cursor >= self.input.len() {
return None;
}
let rv = &self.input[self.cursor..];
self.cursor = self.input.len();
return Some(rv);
}
// TODO: get_n
pub fn get_quoted(&mut self, c: u8) -> Option<&'a [u8]> {
pub fn get_quoted(&mut self, c: u8) -> Result<&'a [u8]> {
let length = self.input.len();
if self.cursor >= length || self.input[self.cursor] != c {
return None;
return Err(Error::from(
"quoted string does not begin with quote character",
));
}
let start = self.cursor + 1;
@@ -64,11 +51,10 @@ impl<'a> Pig<'a> {
i += 1
}
if i == length {
// unclosed quote
return None;
return Err(Error::from("unclosed quote"));
}
if i == start {
return Some(&self.input[i..i]);
return Ok(&self.input[i..i]);
}
if self.input[i - 1] == b'\\' {
@@ -88,24 +74,12 @@ impl<'a> Pig<'a> {
// none of the above matched, so we are at the end
self.cursor = i + 1;
return Some(&self.input[start..i]);
return Ok(&self.input[start..i]);
}
unreachable!();
}
// TODO: (missing funcs)
pub fn skip_n(&mut self, n: usize) -> bool {
let length = self.input.len();
if self.cursor < length && self.cursor + n <= length {
self.cursor += n;
return true;
}
return false;
}
pub fn skip(&mut self, c: u8) -> Result<()> {
if self.cursor < self.input.len() && self.input[self.cursor] == c {
self.cursor += 1;
@@ -117,23 +91,6 @@ impl<'a> Pig<'a> {
));
}
// TODO: skip_all_one_of
// TODO: skip_ws
pub fn next(&mut self) -> Option<u8> {
if self.cursor >= self.input.len() {
return None;
}
let rv = self.input[self.cursor];
self.cursor += 1;
return Some(rv);
}
// TODO: next_n
// TODO: cursor
// TODO: save
// TODO: restore
pub fn depleted(&self) -> bool {
self.cursor >= self.input.len()
}
@@ -164,92 +121,60 @@ mod test {
assert_eq!(pig.get_until(b'/').unwrap(), &s[..]);
}
#[test]
fn test_get_until_eos() {
let s = b"abc:123";
let mut pig = Pig::new(s);
assert_eq!(pig.get_until_eos(), Some(&s[..]));
}
#[test]
fn test_get_quoted() {
let s = b"'abcd'efg";
let mut pig = Pig::new(s);
assert_eq!(pig.get_quoted(b'\''), Some(&s[1..5]));
assert_eq!(pig.next(), Some(b'e'));
assert_eq!(pig.get_quoted(b'\'').unwrap(), &s[1..5]);
assert_eq!(pig.cursor, 6);
}
#[test]
fn test_get_quoted_unopened() {
let s = b"abcd'efg";
let mut pig = Pig::new(s);
assert_eq!(pig.get_quoted(b'\''), None);
assert_eq!(pig.next(), Some(b'a')); // nothing consumed
assert!(pig.get_quoted(b'\'').is_err());
assert_eq!(pig.cursor, 0); // nothing consumed
}
#[test]
fn test_get_quoted_unclosed() {
let s = b"'abcdefg";
let mut pig = Pig::new(s);
assert_eq!(pig.get_quoted(b'\''), None);
assert_eq!(pig.next(), Some(b'\'')); // nothing consumed
assert!(pig.get_quoted(b'\'').is_err());
assert_eq!(pig.cursor, 0);
}
#[test]
fn test_get_quoted_escaped() {
let s = b"'abc\\'de'fg";
let mut pig = Pig::new(s);
assert_eq!(pig.get_quoted(b'\''), Some(&s[1..8]));
assert_eq!(pig.next(), Some(b'f'));
assert_eq!(pig.get_quoted(b'\'').unwrap(), &s[1..8]);
assert_eq!(pig.cursor, 9);
}
#[test]
fn test_get_quoted_double_escaped() {
let s = b"'abc\\\\'de'fg";
let mut pig = Pig::new(s);
assert_eq!(pig.get_quoted(b'\''), Some(&s[1..6]));
assert_eq!(pig.next(), Some(b'd'));
assert_eq!(pig.get_quoted(b'\'').unwrap(), &s[1..6]);
assert_eq!(pig.cursor, 7);
}
#[test]
fn test_get_quoted_triple_escaped() {
let s = b"'abc\\\\\\'de'fg";
let mut pig = Pig::new(s);
assert_eq!(pig.get_quoted(b'\''), Some(&s[1..10]));
assert_eq!(pig.next(), Some(b'f'));
assert_eq!(pig.get_quoted(b'\'').unwrap(), &s[1..10]);
assert_eq!(pig.cursor, 11);
}
#[test]
fn test_get_quoted_all_escapes() {
let s = b"'\\\\\\'\\\\'fg";
let mut pig = Pig::new(s);
assert_eq!(pig.get_quoted(b'\''), Some(&s[1..7]));
assert_eq!(pig.next(), Some(b'f'));
}
#[test]
fn test_skip_n() {
let s = b"abc:123";
let mut pig = Pig::new(s);
assert!(pig.skip_n(3));
assert_eq!(pig.get_until_eos(), Some(&s[3..]));
}
#[test]
fn test_skip_n_too_long() {
let s = b"abc:123";
let mut pig = Pig::new(s);
assert!(!pig.skip_n(33));
// nothing is consumed
assert_eq!(pig.get_until_eos(), Some(&s[..]));
}
#[test]
fn test_skip_n_exact_eos() {
let s = b"abc:123";
let mut pig = Pig::new(s);
assert!(pig.skip_n(7));
assert_eq!(pig.get_until_eos(), None);
assert_eq!(pig.get_quoted(b'\'').unwrap(), &s[1..7]);
assert_eq!(pig.cursor, 8);
}
#[test]
@@ -257,7 +182,7 @@ mod test {
let s = b"foo";
let mut pig = Pig::new(s);
assert!(pig.skip(b'f').is_ok());
assert_eq!(pig.get_until_eos(), Some(&s[1..]));
assert_eq!(pig.cursor, 1);
}
#[test]
@@ -265,36 +190,14 @@ mod test {
let s = b"foo";
let mut pig = Pig::new(s);
assert!(pig.skip(b'x').is_err());
assert_eq!(pig.get_until_eos(), Some(&s[..]));
assert_eq!(pig.cursor, 0); // nothing consumed
}
#[test]
fn test_skip_eos() {
let s = b"foo";
let s = b"f";
let mut pig = Pig::new(s);
assert!(pig.skip_n(3));
assert!(pig.skip(b'x').is_err());
}
#[test]
fn test_next() {
let s = b"foo";
let mut pig = Pig::new(s);
assert_eq!(pig.next(), Some(b'f'));
assert_eq!(pig.next(), Some(b'o'));
assert_eq!(pig.next(), Some(b'o'));
assert_eq!(pig.next(), None);
assert_eq!(pig.next(), None);
}
#[test]
fn test_depleted() {
let s = b"xy";
let mut pig = Pig::new(s);
assert!(!pig.depleted());
assert_eq!(pig.next(), Some(b'x'));
assert!(!pig.depleted());
assert_eq!(pig.next(), Some(b'y'));
assert!(pig.depleted());
assert!(pig.skip(b'f').is_ok());
assert!(pig.skip(b'f').is_err());
}
}