Make codebase consistent with design.md

This commit is contained in:
2025-08-17 17:00:23 -04:00
parent 1b1b875a3a
commit 9e397d19c9
11 changed files with 154 additions and 75 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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.

View File

@@ -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

View File

@@ -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.