diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/codec-json/json.tmpl.h | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h index b4e8d6d..063595d 100644 --- a/src/codec-json/json.tmpl.h +++ b/src/codec-json/json.tmpl.h @@ -314,46 +314,60 @@ struct json_encode<schema::Union<schema::Member<T,Key>...>, RootSchema, FromEnco } }; +struct json_helper { + static bool is_whitespace(int8_t ch) { + return ch == '\t' || ch == ' ' || ch == '\r' || ch == '\n'; + } + + static void skip_whitespace(buffer_view& buff) { + while(buff.read_composite_length() > 0 && json_helper::is_whitespace(buff.read())) { + buff.read_advance(1); + } + } +}; + template<typename Schema, typename RootSchema, typename ToDecode> struct json_decode; template<typename T, size_t N, typename RootSchema, typename ToDecode> struct json_decode<schema::Primitive<T,N>, RootSchema, ToDecode> { - static error_or<void> decode(buffer_view& buff, data<schema::Primitive<T,N>, ToDecode>& to){ - assert((buff.read() >= '0' && buff.read() <= '9') || - buff.read() == '+' || buff.read() == '-'); + static error_or<void> decode(buffer_view& buff, data<schema::Primitive<T,N>, ToDecode>& to) { + assert( + ( buff.read() >= '0' && buff.read() <= '9') + || ( buff.read() == '+' || buff.read() == '-') + ); std::size_t offset = 0; - if(buff.read() == '-'){ + if (buff.read() == '-'){ ++offset; - }else if(buff.read() == '+'){ + } else if (buff.read() == '+'){ return make_error<err::not_supported>(); } if (offset >= buff.read_composite_length()) { return make_error<err::buffer_exhausted>(); } - if(buff.read(offset) >= '1' && buff.read(offset) <= '9'){ + if (buff.read(offset) >= '1' && buff.read(offset) <= '9') { ++offset; - if(offset >= buff.read_composite_length()){ + if(offset >= buff.read_composite_length()) { return make_error<err::buffer_exhausted>(); } while(1){ - if (buff.read(offset) >= '0' && buff.read(offset) <= '9'){ + if (buff.read(offset) >= '0' && buff.read(offset) <= '9') { ++offset; - if(offset >= buff.read_composite_length()){ + if(offset >= buff.read_composite_length()) { break; } continue; } break; } - }else if (buff.read(offset) == '0' ){ + } else if (buff.read(offset) == '0' ) { ++offset; - }else{ + } else { return make_error<err::buffer_exhausted>(); } @@ -388,7 +402,8 @@ struct json_decode<schema::Array<T,D>, RootSchema, ToDecode> { if( buff.read_composite_length() == 0 ){ return make_error<err::buffer_exhausted>(); } - + + json_helper::skip_whitespace(buff); } return void_t{}; } |