Review comments: downgrade to error-chain 0.8.1 for Send + Sync bound; use combine::primitive::Error.
This commit is contained in:
parent
60c082b61e
commit
ff0147e89c
8 changed files with 38 additions and 11 deletions
|
@ -18,7 +18,7 @@ rustc_version = "0.1.7"
|
|||
|
||||
[dependencies]
|
||||
clap = "2.19.3"
|
||||
error-chain = "0.9.0"
|
||||
error-chain = "0.8.1"
|
||||
nickel = "0.9.0"
|
||||
slog = "1.4.0"
|
||||
slog-scope = "0.2.2"
|
||||
|
|
|
@ -4,7 +4,7 @@ version = "0.0.1"
|
|||
workspace = ".."
|
||||
|
||||
[dependencies]
|
||||
error-chain = "0.9.0"
|
||||
error-chain = "0.8.1"
|
||||
itertools = "0.5.9"
|
||||
lazy_static = "0.2.2"
|
||||
ordered-float = "0.4.0"
|
||||
|
|
|
@ -4,7 +4,7 @@ version = "0.0.1"
|
|||
workspace = ".."
|
||||
|
||||
[dependencies]
|
||||
error-chain = "0.9.0"
|
||||
error-chain = "0.8.1"
|
||||
|
||||
[dependencies.mentat_core]
|
||||
path = "../core"
|
||||
|
|
|
@ -5,7 +5,7 @@ workspace = ".."
|
|||
|
||||
[dependencies]
|
||||
combine = "2.2.2"
|
||||
error-chain = "0.9.0"
|
||||
error-chain = "0.8.1"
|
||||
matches = "0.1"
|
||||
|
||||
[dependencies.edn]
|
||||
|
|
|
@ -353,15 +353,15 @@ enum FindQueryPart {
|
|||
}
|
||||
|
||||
def_parser!(Find, vars, BTreeSet<Variable>, {
|
||||
vector().of_exactly(many(Query::variable()).map(|vars: Vec<Variable>| {
|
||||
vector().of_exactly(many(Query::variable()).and_then(|vars: Vec<Variable>| {
|
||||
let given = vars.len();
|
||||
let set: BTreeSet<Variable> = vars.into_iter().collect();
|
||||
if given != set.len() {
|
||||
// TODO: find out what the variable is!
|
||||
// TODO: figure out how to use `and_then` to return an error here.
|
||||
panic!(Error::from_kind(ErrorKind::DuplicateVariableError));
|
||||
let e = Box::new(Error::from_kind(ErrorKind::DuplicateVariableError));
|
||||
Err(combine::primitives::Error::Other(e))
|
||||
} else {
|
||||
set
|
||||
Ok(set)
|
||||
}
|
||||
}))
|
||||
});
|
||||
|
@ -549,6 +549,33 @@ mod test {
|
|||
vec![variable(e.clone())]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_repeated_vars() {
|
||||
let e = edn::PlainSymbol::new("?e");
|
||||
let f = edn::PlainSymbol::new("?f");
|
||||
let input = edn::Value::Vector(vec![edn::Value::PlainSymbol(e.clone()),
|
||||
edn::Value::PlainSymbol(f.clone()),]);
|
||||
assert_parses_to!(Find::vars, input,
|
||||
vec![variable(e.clone()), variable(f.clone())].into_iter().collect());
|
||||
|
||||
let g = edn::PlainSymbol::new("?g");
|
||||
let input = edn::Value::Vector(vec![edn::Value::PlainSymbol(g.clone()),
|
||||
edn::Value::PlainSymbol(g.clone()),]);
|
||||
|
||||
let mut par = Find::vars();
|
||||
let result = par.parse(input.with_spans().into_atom_stream())
|
||||
.map(|x| x.0)
|
||||
.map_err(|e| if let Some(combine::primitives::Error::Other(x)) = e.errors.into_iter().next() {
|
||||
// Pattern matching on boxes is rocket science until Rust Nightly features hit
|
||||
// stable. ErrorKind isn't Clone, so convert to strings. We could pattern match
|
||||
// for exact comparison here.
|
||||
x.downcast::<Error>().ok().map(|e| e.to_string())
|
||||
} else {
|
||||
None
|
||||
});
|
||||
assert_eq!(result, Err(Some("duplicates in variable list".to_string())));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_or() {
|
||||
let oj = edn::PlainSymbol::new("or");
|
||||
|
|
|
@ -4,7 +4,7 @@ version = "0.0.1"
|
|||
workspace = ".."
|
||||
|
||||
[dependencies]
|
||||
error-chain = "0.9.0"
|
||||
error-chain = "0.8.1"
|
||||
|
||||
[dependencies.rusqlite]
|
||||
version = "0.10.1"
|
||||
|
|
|
@ -4,7 +4,7 @@ version = "0.0.1"
|
|||
workspace = ".."
|
||||
|
||||
[dependencies]
|
||||
error-chain = "0.9.0"
|
||||
error-chain = "0.8.1"
|
||||
ordered-float = "0.4.0"
|
||||
|
||||
[dependencies.mentat_core]
|
||||
|
|
|
@ -5,7 +5,7 @@ workspace = ".."
|
|||
|
||||
[dependencies]
|
||||
combine = "2.2.2"
|
||||
error-chain = "0.9.0"
|
||||
error-chain = "0.8.1"
|
||||
|
||||
[dependencies.edn]
|
||||
path = "../edn"
|
||||
|
|
Loading…
Reference in a new issue