improve error message for conflicting tables

This commit is contained in:
ToruNiina
2018-12-13 20:17:57 +09:00
parent e79069cc47
commit e86777d19c

View File

@@ -1004,24 +1004,35 @@ insert_nested_key(table& root, const toml::value& v,
{ {
if(tab->count(k) == 1) // there is already an array of table if(tab->count(k) == 1) // there is already an array of table
{ {
if(!(tab->at(k).is(value_t::Array))) if(tab->at(k).is(value_t::Table))
{
// show special err msg for conflicting table
throw syntax_error(format_underline(concat_to_string(
"[error] toml::insert_value: array of table (\"",
format_dotted_keys(first, last), "\") cannot insert"
"ed"), get_region(tab->at(k)), "table already defined",
get_region(v), "this conflicts with the previous table"));
}
else if(!(tab->at(k).is(value_t::Array)))
{ {
throw syntax_error(format_underline(concat_to_string( throw syntax_error(format_underline(concat_to_string(
"[error] toml::insert_value: target value (\"", "[error] toml::insert_value: array of table (\"",
format_dotted_keys(first, last), "\") is" format_dotted_keys(first, last), "\") collides with"
" not an array of tables"), get_region(tab->at(k)), " existing value"), get_region(tab->at(k)),
concat_to_string("actual type is ", tab->at(k).type()), concat_to_string("this ", tab->at(k).type(), "value"
get_region(v), "this is an array of tables")); "already exists"), get_region(v), "while inserting"
"this array-of-tables"));
} }
array& a = tab->at(k).template cast<toml::value_t::Array>(); array& a = tab->at(k).template cast<toml::value_t::Array>();
if(!(a.front().is(value_t::Table))) if(!(a.front().is(value_t::Table)))
{ {
throw syntax_error(format_underline(concat_to_string( throw syntax_error(format_underline(concat_to_string(
"[error] toml::insert_value: target value (\"", "[error] toml::insert_value: array of table (\"",
format_dotted_keys(first, last), "\") is" format_dotted_keys(first, last), "\") collides with"
" not an array of tables"), get_region(tab->at(k)), " existing value"), get_region(tab->at(k)),
concat_to_string("actual type is ", tab->at(k).type()), concat_to_string("this ", tab->at(k).type(), "value"
get_region(v), "this is an array of tables")); "already exists"), get_region(v), "while inserting"
"this array-of-tables"));
} }
a.push_back(v); a.push_back(v);
return ok(true); return ok(true);