Make codebase consistent with design.md
This commit is contained in:
@@ -449,16 +449,33 @@ void JsonCommitRequestParser::handle_completed_number(std::string_view s) {
|
||||
}
|
||||
}
|
||||
|
||||
bool JsonCommitRequestParser::parse(CommitRequest &request, char *data,
|
||||
size_t len) {
|
||||
CommitRequestParser::ParseResult
|
||||
JsonCommitRequestParser::parse(CommitRequest &request, char *data, size_t len) {
|
||||
if (!begin_streaming_parse(request)) {
|
||||
return false;
|
||||
return ParseResult::OutOfMemory;
|
||||
}
|
||||
parse_chunk(data, len);
|
||||
finish_streaming_parse();
|
||||
|
||||
return !has_parse_error() && !request.leader_id().empty() &&
|
||||
parser_context_->has_read_version_been_set;
|
||||
ParseStatus status = parse_chunk(data, len);
|
||||
if (status == ParseStatus::Error) {
|
||||
return has_parse_error() ? ParseResult::InvalidJson
|
||||
: ParseResult::InvalidField;
|
||||
}
|
||||
|
||||
status = finish_streaming_parse();
|
||||
if (status == ParseStatus::Error) {
|
||||
return has_parse_error() ? ParseResult::InvalidJson
|
||||
: ParseResult::InvalidField;
|
||||
}
|
||||
|
||||
if (request.leader_id().empty()) {
|
||||
return ParseResult::MissingField;
|
||||
}
|
||||
|
||||
if (!parser_context_->has_read_version_been_set) {
|
||||
return ParseResult::MissingField;
|
||||
}
|
||||
|
||||
return ParseResult::Success;
|
||||
}
|
||||
|
||||
bool JsonCommitRequestParser::begin_streaming_parse(CommitRequest &request) {
|
||||
|
||||
@@ -112,7 +112,7 @@ public:
|
||||
JsonCommitRequestParser &operator=(JsonCommitRequestParser &&other) noexcept;
|
||||
|
||||
// CommitRequestParser interface implementation
|
||||
bool parse(CommitRequest &request, char *data, size_t len) override;
|
||||
ParseResult parse(CommitRequest &request, char *data, size_t len) override;
|
||||
bool begin_streaming_parse(CommitRequest &request) override;
|
||||
ParseStatus parse_chunk(char *data, size_t len) override;
|
||||
ParseStatus finish_streaming_parse() override;
|
||||
|
||||
@@ -56,7 +56,7 @@ enum class JsonTokenType {
|
||||
*/
|
||||
inline JsonTokenType get_json_token_type(std::string_view str) {
|
||||
const JsonToken *token =
|
||||
Perfect_Hash::lookup_json_token(str.data(), str.size());
|
||||
PerfectHash::lookup_json_token(str.data(), str.size());
|
||||
if (token) {
|
||||
return static_cast<JsonTokenType>(token->token_id);
|
||||
}
|
||||
|
||||
@@ -26,14 +26,14 @@ struct JsonToken {
|
||||
*
|
||||
* @example
|
||||
* ```cpp
|
||||
* const JsonToken* token = Perfect_Hash::lookup_json_token("request_id", 10);
|
||||
* const JsonToken* token = PerfectHash::lookup_json_token("request_id", 10);
|
||||
* if (token) {
|
||||
* JsonTokenType type = static_cast<JsonTokenType>(token->token_id);
|
||||
* // Handle known token...
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
class Perfect_Hash {
|
||||
class PerfectHash {
|
||||
public:
|
||||
/**
|
||||
* @brief Look up a JSON token by name using perfect hash.
|
||||
|
||||
22
src/main.cpp
22
src/main.cpp
@@ -87,10 +87,28 @@ int main(int argc, char *argv[]) {
|
||||
})";
|
||||
auto copy = sample_json;
|
||||
|
||||
if (parser.parse(request, copy.data(), copy.size())) {
|
||||
auto parse_result = parser.parse(request, copy.data(), copy.size());
|
||||
if (parse_result == CommitRequestParser::ParseResult::Success) {
|
||||
print_stats(request);
|
||||
} else {
|
||||
std::cout << "✗ Failed to parse commit request" << std::endl;
|
||||
std::cout << "✗ Failed to parse commit request: ";
|
||||
switch (parse_result) {
|
||||
case CommitRequestParser::ParseResult::InvalidJson:
|
||||
std::cout << "Invalid JSON format" << std::endl;
|
||||
break;
|
||||
case CommitRequestParser::ParseResult::MissingField:
|
||||
std::cout << "Missing required field" << std::endl;
|
||||
break;
|
||||
case CommitRequestParser::ParseResult::InvalidField:
|
||||
std::cout << "Invalid field value" << std::endl;
|
||||
break;
|
||||
case CommitRequestParser::ParseResult::OutOfMemory:
|
||||
std::cout << "Out of memory" << std::endl;
|
||||
break;
|
||||
default:
|
||||
std::cout << "Unknown error" << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Demonstrate streaming parsing
|
||||
|
||||
@@ -24,6 +24,17 @@ public:
|
||||
Error ///< Parse error occurred (check get_parse_error() for details)
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Result type for one-shot parsing operations.
|
||||
*/
|
||||
enum class ParseResult {
|
||||
Success, ///< Parsing completed successfully
|
||||
InvalidJson, ///< Invalid JSON format or structure
|
||||
MissingField, ///< Required field missing from input
|
||||
InvalidField, ///< Field value is invalid or malformed
|
||||
OutOfMemory ///< Arena allocation failed
|
||||
};
|
||||
|
||||
virtual ~CommitRequestParser() = default;
|
||||
|
||||
/**
|
||||
@@ -31,9 +42,9 @@ public:
|
||||
* @param request The CommitRequest object to populate
|
||||
* @param data Pointer to the data buffer
|
||||
* @param len Length of the data in bytes
|
||||
* @return true if parsing succeeded, false otherwise
|
||||
* @return ParseResult indicating success or specific error type
|
||||
*/
|
||||
virtual bool parse(CommitRequest &request, char *data, size_t len) = 0;
|
||||
virtual ParseResult parse(CommitRequest &request, char *data, size_t len) = 0;
|
||||
|
||||
/**
|
||||
* @brief Initialize streaming parsing.
|
||||
|
||||
Reference in New Issue
Block a user