Verify that nothing but tables exist in base table

This commit is contained in:
Marcel Müller 2016-02-06 19:26:00 +01:00
parent ece70d78a7
commit 6173cff762
No known key found for this signature in database
GPG key ID: DD4ED37D0CAC76E2
2 changed files with 24 additions and 11 deletions

View file

@ -130,6 +130,8 @@ pub enum ParserErrorKind {
TOMLParserErrors, TOMLParserErrors,
MissingMainSection, MissingMainSection,
MissingVersionInfo, MissingVersionInfo,
NonTableInBaseTable,
HeaderInconsistency,
} }
pub struct ParserError { pub struct ParserError {
@ -173,6 +175,8 @@ impl Error for ParserError {
ParserErrorKind::TOMLParserErrors => "Several TOML-Parser-Errors", ParserErrorKind::TOMLParserErrors => "Several TOML-Parser-Errors",
ParserErrorKind::MissingMainSection => "Missing main section", ParserErrorKind::MissingMainSection => "Missing main section",
ParserErrorKind::MissingVersionInfo => "Missing version information in main section", ParserErrorKind::MissingVersionInfo => "Missing version information in main section",
ParserErrorKind::NonTableInBaseTable => "A non-table was found in the base table",
ParserErrorKind::HeaderInconsistency => "The header is inconsistent",
} }
} }

View file

@ -327,13 +327,7 @@ impl EntryHeader {
} }
pub fn verify(&self) -> Result<()> { pub fn verify(&self) -> Result<()> {
if !has_main_section(&self.toml) { verify_header(&self.toml)
Err(StoreError::from(ParserError::new(ParserErrorKind::MissingMainSection, None)))
} else if !has_imag_version_in_main_section(&self.toml) {
Err(StoreError::from(ParserError::new(ParserErrorKind::MissingVersionInfo, None)))
} else {
Ok(())
}
} }
} }
@ -352,17 +346,32 @@ fn build_default_header() -> BTreeMap<String, Value> {
m m
} }
fn verify_header(t: &Table) -> Result<()> {
if !has_main_section(t) {
Err(StoreError::from(ParserError::new(ParserErrorKind::MissingMainSection, None)))
} else if !has_imag_version_in_main_section(t) {
Err(StoreError::from(ParserError::new(ParserErrorKind::MissingVersionInfo, None)))
} else if !has_only_tables(t) {
debug!("Could not verify that it only has tables in its base table");
Err(StoreError::from(ParserError::new(ParserErrorKind::NonTableInBaseTable, None)))
} else {
Ok(())
}
}
fn verify_header_consistency(t: Table) -> EntryResult<Table> { fn verify_header_consistency(t: Table) -> EntryResult<Table> {
if !has_main_section(&t) { use std::error::Error;
Err(ParserError::new(ParserErrorKind::MissingMainSection, None)) if let Err(e) = verify_header(&t) {
} else if !has_imag_version_in_main_section(&t) { Err(ParserError::new(ParserErrorKind::HeaderInconsistency, None))
Err(ParserError::new(ParserErrorKind::MissingVersionInfo, None))
} else { } else {
Ok(t) Ok(t)
} }
} }
fn has_only_tables(t: &Table) -> bool {
t.iter().all(|(_, x)| if let &Value::Table(_) = x { true } else { false })
}
fn has_main_section(t: &Table) -> bool { fn has_main_section(t: &Table) -> bool {
t.contains_key("imag") && t.contains_key("imag") &&
match t.get("imag") { match t.get("imag") {