0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-26 07:23:53 +01:00

ircd::json: Add integrated type-checking overloads to reduce call count.

This commit is contained in:
Jason Volk 2020-11-09 00:00:20 -08:00
parent 9b4dd43cf2
commit 5958e73ff8
2 changed files with 63 additions and 2 deletions

View file

@ -89,12 +89,14 @@ struct ircd::json::object
size_t count() const;
size_t size() const; // warns if used; use count()
bool has(const string_view &key) const;
bool has(const string_view &key, const enum json::type &) const; // false if not type
// returns value or default
template<class T> T get(const string_view &key, const T &def = T{}) const;
string_view get(const string_view &key, const string_view &def = {}) const;
// returns value or throws not_found
template<class T = string_view> T at(const string_view &key, const enum json::type &) const;
template<class T = string_view> T at(const string_view &key) const;
// returns value or empty
@ -168,6 +170,44 @@ catch(const bad_lex_cast &e)
};
}
template<class T>
inline T
ircd::json::object::at(const string_view &key,
const enum json::type &type)
const try
{
const auto it
{
find(key)
};
if(unlikely(it == end()))
throw not_found
{
"'%s'", key
};
if(unlikely(!json::type(it->second, type, strict)))
throw type_error
{
"'%s' expected %s; got %s instead",
key,
reflect(type),
reflect(json::type(it->second, std::nothrow)),
};
return lex_cast<T>(it->second);
}
catch(const bad_lex_cast &e)
{
throw type_error
{
"'%s' must cast to type %s",
key,
typeid(T).name()
};
}
template<ircd::json::name_hash_t key,
class T>
inline T

View file

@ -2707,8 +2707,14 @@ ircd::string_view
ircd::json::object::operator[](const string_view &key)
const
{
const auto it(find(key));
return it != end()? it->second : string_view{};
const auto it
{
find(key)
};
return it != end()?
it->second:
string_view{};
}
ircd::string_view
@ -2725,6 +2731,21 @@ const
return json::strung(*this);
}
bool
ircd::json::object::has(const string_view &key,
const enum json::type &type)
const
{
const auto &it
{
find(key)
};
return it != end()?
json::type(it->second, type, strict):
false;
}
bool
ircd::json::object::has(const string_view &key)
const