|  | // Copyright 2019 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "src/lib/json_parser/rapidjson_validation.h" | 
|  |  | 
|  | #include <lib/fitx/result.h> | 
|  | #include <lib/syslog/cpp/macros.h> | 
|  | #include <zircon/assert.h> | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include <rapidjson/error/en.h> | 
|  |  | 
|  | namespace json_parser { | 
|  |  | 
|  | std::string InitSchemaError::ToString() const { | 
|  | std::stringstream s; | 
|  | s << "Schema validation spec is not valid JSON" | 
|  | << ": offset " << offset << ", " << rapidjson::GetParseError_En(code); | 
|  | return s.str(); | 
|  | } | 
|  |  | 
|  | fitx::result<InitSchemaError, rapidjson::SchemaDocument> InitSchema(std::string_view json) { | 
|  | rapidjson::Document schema_document; | 
|  | if (schema_document.Parse(json.data(), json.size()).HasParseError()) { | 
|  | auto offset = schema_document.GetErrorOffset(); | 
|  | auto code = schema_document.GetParseError(); | 
|  | return fitx::error(InitSchemaError{.offset = offset, .code = code}); | 
|  | } | 
|  | return fitx::ok(rapidjson::SchemaDocument(schema_document)); | 
|  | } | 
|  |  | 
|  | fitx::result<std::string> ValidateSchema(const rapidjson::Value& value, | 
|  | const rapidjson::SchemaDocument& schema, | 
|  | std::string_view value_name) { | 
|  | rapidjson::SchemaValidator validator(schema); | 
|  | if (!value.Accept(validator)) { | 
|  | rapidjson::StringBuffer uri_buffer; | 
|  | validator.GetInvalidSchemaPointer().StringifyUriFragment(uri_buffer); | 
|  | std::stringstream s; | 
|  | s << "Incorrect schema "; | 
|  |  | 
|  | if (!value_name.empty()) { | 
|  | s << "of \"" << value_name << "\" "; | 
|  | } | 
|  | s << "at " << uri_buffer.GetString() | 
|  | << " , schema violation: " << validator.GetInvalidSchemaKeyword(); | 
|  | return fitx::error(s.str()); | 
|  | } | 
|  | return fitx::ok(); | 
|  | } | 
|  |  | 
|  | }  // namespace json_parser |