diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-16 13:41:54 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-16 13:41:54 +0200 |
commit | 47f4cfe677bcd8b3372ddbf09751cd023f3ad9ff (patch) | |
tree | 46d7ec60bca1c66c8a088b55f4f0c343bc5ceccb | |
parent | d134daa2b0658d8624988062cb10e536ca34c0b8 (diff) |
Json decoding for booleans
-rw-r--r-- | modules/codec-json/c++/json.tmpl.hpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/modules/codec-json/c++/json.tmpl.hpp b/modules/codec-json/c++/json.tmpl.hpp index 6193e3f..36f14de 100644 --- a/modules/codec-json/c++/json.tmpl.hpp +++ b/modules/codec-json/c++/json.tmpl.hpp @@ -546,8 +546,26 @@ struct json_decode<schema::Bool, ToDecode> { using Schema = schema::Bool; static error_or<void> decode(buffer_view& buff, data<Schema, ToDecode>& to){ + SAW_ASSERT(buff.read() == 't' || buff.read() == 'f'){ + return make_error<err::invalid_state>("Invalid JSON boolean"); + } + + bool assumption = (buff.read() == 't'); + std::string_view expected_str = assumption ? "true" : "false"; - return make_error<err::not_implemented>(); + if(buff.read_composite_length() < expected_str.size()){ + return make_error<err::buffer_exhausted>(); + } + + for(uint64_t i = 0; i < expected_str.size(); ++i){ + if(buff.read(i) != static_cast<uint8_t>(expected_str[i])){ + return make_error<err::invalid_state>("Invalid JSON boolean"); + } + } + + to.set(assumption); + buff.read_advance(expected_str.size()); + return make_void(); } }; |