Change to_namespaced_keyword(s) to return a Result rather than Option to (#333)
reduce error handling throughout db code. Fixes #331. r=nalexander
This commit is contained in:
parent
6f67f8563b
commit
bc2b2ec4c8
3 changed files with 13 additions and 18 deletions
17
db/src/db.rs
17
db/src/db.rs
|
@ -346,8 +346,6 @@ impl TypedSQLValue for TypedValue {
|
|||
(10, rusqlite::types::Value::Text(x)) => Ok(TypedValue::String(x)),
|
||||
(13, rusqlite::types::Value::Text(x)) => {
|
||||
to_namespaced_keyword(&x).map(|k| TypedValue::Keyword(k))
|
||||
// TODO Use custom ErrorKind https://github.com/brson/error-chain/issues/117
|
||||
.ok_or(ErrorKind::NotYetImplemented(format!("InvalidNamespacedKeyword: {}", x)).into())
|
||||
},
|
||||
(_, value) => bail!(ErrorKind::BadSQLValuePair(value, value_type_tag)),
|
||||
}
|
||||
|
@ -402,10 +400,7 @@ pub fn read_ident_map(conn: &rusqlite::Connection) -> Result<IdentMap> {
|
|||
let mut stmt: rusqlite::Statement = conn.prepare("SELECT ident, entid FROM idents")?;
|
||||
let m = stmt.query_and_then(&[], |row| -> Result<(symbols::NamespacedKeyword, Entid)> {
|
||||
let ident: String = row.get(0);
|
||||
to_namespaced_keyword(&ident)
|
||||
.map(|i| (i, row.get(1)))
|
||||
// TODO Use custom ErrorKind https://github.com/brson/error-chain/issues/117
|
||||
.ok_or(ErrorKind::NotYetImplemented(format!("InvalidNamespacedKeyword: {}", ident.clone())).into())
|
||||
to_namespaced_keyword(&ident).map(|i| (i, row.get(1)))
|
||||
})?.collect();
|
||||
m
|
||||
}
|
||||
|
@ -435,13 +430,9 @@ pub fn read_schema(conn: &rusqlite::Connection, ident_map: &IdentMap) -> Result<
|
|||
let ident = to_namespaced_keyword(&symbolic_ident);
|
||||
let attr = to_namespaced_keyword(&symbolic_attr);
|
||||
match (ident, attr, typed_value) {
|
||||
(Some(ident), Some(attr), typed_value) => Ok((ident, attr, typed_value)),
|
||||
(None, _, _) =>
|
||||
// TODO Use custom ErrorKind https://github.com/brson/error-chain/issues/117
|
||||
Err(ErrorKind::NotYetImplemented(format!("InvalidNamespacedKeyword: {}", &symbolic_ident)).into()),
|
||||
(_, None, _) =>
|
||||
// TODO Use custom ErrorKind https://github.com/brson/error-chain/issues/117
|
||||
Err(ErrorKind::NotYetImplemented(format!("InvalidNamespacedKeyword: {}", &symbolic_attr)).into()),
|
||||
(Ok(ident), Ok(attr), typed_value) => Ok((ident, attr, typed_value)),
|
||||
(Err(e), _, _) => Err(e),
|
||||
(_, Err(e), _) => Err(e),
|
||||
}
|
||||
})?.collect();
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ extern crate mentat_tx_parser;
|
|||
|
||||
use itertools::Itertools;
|
||||
use std::iter::repeat;
|
||||
use errors::{ErrorKind, Result};
|
||||
|
||||
pub mod db;
|
||||
mod bootstrap;
|
||||
|
@ -46,13 +47,16 @@ use edn::symbols;
|
|||
// TODO: replace with sqlite3_limit. #288.
|
||||
pub const SQLITE_MAX_VARIABLE_NUMBER: usize = 999;
|
||||
|
||||
pub fn to_namespaced_keyword(s: &str) -> Option<symbols::NamespacedKeyword> {
|
||||
pub fn to_namespaced_keyword(s: &str) -> Result<symbols::NamespacedKeyword> {
|
||||
let splits = [':', '/'];
|
||||
let mut i = s.split(&splits[..]);
|
||||
match (i.next(), i.next(), i.next(), i.next()) {
|
||||
let nsk = match (i.next(), i.next(), i.next(), i.next()) {
|
||||
(Some(""), Some(namespace), Some(name), None) => Some(symbols::NamespacedKeyword::new(namespace, name)),
|
||||
_ => None
|
||||
}
|
||||
_ => None,
|
||||
};
|
||||
|
||||
// TODO Use custom ErrorKind https://github.com/brson/error-chain/issues/117
|
||||
nsk.ok_or(ErrorKind::NotYetImplemented(format!("InvalidNamespacedKeyword: {}", s)).into())
|
||||
}
|
||||
|
||||
/// Prepare an SQL `VALUES` block, like (?, ?, ?), (?, ?, ?).
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#![allow(dead_code)]
|
||||
|
||||
use entids;
|
||||
use errors::*;
|
||||
use errors::{ErrorKind, Result};
|
||||
use edn::symbols;
|
||||
use mentat_core::{
|
||||
Attribute,
|
||||
|
|
Loading…
Reference in a new issue