| 62 | } |
| 63 | |
| 64 | Result<std::shared_ptr<DataType>> OpaqueType::Deserialize( |
| 65 | std::shared_ptr<DataType> storage_type, const std::string& serialized_data) const { |
| 66 | rapidjson::Document document; |
| 67 | const auto& parsed = document.Parse(serialized_data.data(), serialized_data.length()); |
| 68 | if (parsed.HasParseError()) { |
| 69 | return Status::Invalid("Invalid serialized JSON data for OpaqueType: ", |
| 70 | rapidjson::GetParseError_En(parsed.GetParseError()), ": ", |
| 71 | serialized_data); |
| 72 | } else if (!document.IsObject()) { |
| 73 | return Status::Invalid("Invalid serialized JSON data for OpaqueType: not an object"); |
| 74 | } |
| 75 | if (!document.HasMember("type_name")) { |
| 76 | return Status::Invalid( |
| 77 | "Invalid serialized JSON data for OpaqueType: missing type_name"); |
| 78 | } else if (!document.HasMember("vendor_name")) { |
| 79 | return Status::Invalid( |
| 80 | "Invalid serialized JSON data for OpaqueType: missing vendor_name"); |
| 81 | } |
| 82 | |
| 83 | const auto& type_name = document["type_name"]; |
| 84 | const auto& vendor_name = document["vendor_name"]; |
| 85 | if (!type_name.IsString()) { |
| 86 | return Status::Invalid( |
| 87 | "Invalid serialized JSON data for OpaqueType: type_name is not a string"); |
| 88 | } else if (!vendor_name.IsString()) { |
| 89 | return Status::Invalid( |
| 90 | "Invalid serialized JSON data for OpaqueType: vendor_name is not a string"); |
| 91 | } |
| 92 | |
| 93 | return opaque(std::move(storage_type), type_name.GetString(), vendor_name.GetString()); |
| 94 | } |
| 95 | |
| 96 | std::shared_ptr<Array> OpaqueType::MakeArray(std::shared_ptr<ArrayData> data) const { |
| 97 | DCHECK_EQ(data->type->id(), Type::EXTENSION); |