Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changelog/feature-schema-serde-deserializers.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": "feature",
"category": "aws-cpp-sdk-core",
"contributor": "pulimsr",
"description": "Add schema-serde buffer-based JSON/XML deserializers, Query serializer (awsQuery/ec2Query), and Codec/ClientProtocol"
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include <aws/core/utils/memory/AWSMemory.h>
#include <aws/crt/Types.h>
#include <smithy/Smithy_EXPORTS.h>
#include <smithy/client/schema/ShapeDeserializer.h>

Expand All @@ -9,33 +10,23 @@ namespace schema {

class SMITHY_API CborShapeDeserializer final : public ShapeDeserializer {
public:
CborShapeDeserializer(const unsigned char* data, size_t length);
explicit CborShapeDeserializer(Aws::Crt::ByteCursor data);
~CborShapeDeserializer();

Aws::Crt::Optional<bool> ReadBoolean() override;
Aws::Crt::Optional<int> ReadInteger() override;
Aws::Crt::Optional<int64_t> ReadLong() override;
Aws::Crt::Optional<float> ReadFloat() override;
Aws::Crt::Optional<double> ReadDouble() override;
Aws::Crt::Optional<Aws::String> ReadString() override;
Aws::Crt::Optional<Aws::Utils::DateTime> ReadTimestamp() override;
Aws::Crt::Optional<Aws::Utils::ByteBuffer> ReadBlob() override;
Aws::Crt::Optional<int> ReadEnum() override;
void ReadStruct(const Schema& schema, const StructMemberConsumer& consumer) override;
void ReadList(const Schema& schema, const ListElementConsumer& consumer) override;
void ReadMap(const Schema& schema, const MapEntryConsumer& consumer) override;

size_t BeginStruct() override;
void EndStruct() override;
Aws::Crt::Optional<bool> ReadBoolean(const Schema& schema) override;
Aws::Crt::Optional<int> ReadInteger(const Schema& schema) override;
Aws::Crt::Optional<int64_t> ReadLong(const Schema& schema) override;
Aws::Crt::Optional<float> ReadFloat(const Schema& schema) override;
Aws::Crt::Optional<double> ReadDouble(const Schema& schema) override;
Aws::Crt::Optional<Aws::String> ReadString(const Schema& schema) override;
Aws::Crt::Optional<Aws::Utils::DateTime> ReadTimestamp(const Schema& schema) override;
Aws::Crt::Optional<Aws::Utils::ByteBuffer> ReadBlob(const Schema& schema) override;

size_t BeginList() override;
void EndList() override;

size_t BeginMap() override;
void EndMap() override;

Aws::Crt::Optional<Aws::String> ReadKey() override;
bool IsBreak() override;
bool IsNull() override;
void ReadNull() override;
void SkipValue() override;

private:
class Impl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ class SMITHY_API CborShapeSerializer final : public ShapeSerializer {
void WriteString(const Schema& schema, const Aws::String& value) override;
void WriteTimestamp(const Schema& schema, const Aws::Utils::DateTime& value) override;
void WriteBlob(const Schema& schema, const Aws::Utils::ByteBuffer& value) override;
void WriteEnum(const Schema& schema, int value) override;
void WriteNull(const Schema& schema) override;

SerializerOutcome GetPayload();
Expand Down
113 changes: 113 additions & 0 deletions src/aws-cpp-sdk-core/include/smithy/client/schema/ClientProtocol.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#pragma once

#include <aws/core/utils/memory/AWSMemory.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/crt/Types.h>
#include <smithy/Smithy_EXPORTS.h>
#include <smithy/client/schema/Codec.h>
#include <smithy/client/schema/OperationRequestContext.h>

namespace smithy {
namespace schema {

class Schema;
class SerializableStruct;
class ShapeDeserializer;

class SMITHY_API ClientProtocol {
public:
using SerializerOutcome = Codec::SerializerOutcome;

virtual ~ClientProtocol() = default;

virtual Aws::String GetProtocolId() const = 0;
virtual Aws::String GetContentType() const = 0;
virtual SerializerOutcome SerializeInput(const Schema& schema, const SerializableStruct& input) const = 0;
virtual Aws::UniquePtr<ShapeDeserializer> CreateOutputDeserializer(Aws::Crt::ByteCursor data) const = 0;

virtual SerializerOutcome SerializeRequest(const OperationRequestContext& operation, const Schema& inputSchema,
const SerializableStruct& input) const;

virtual void DeserializeResponse(const OperationRequestContext& operation, Aws::Crt::ByteCursor data,
SerializableStruct& output) const;
};

class SMITHY_API RestJsonProtocol final : public ClientProtocol {
public:
Aws::String GetProtocolId() const override;
Aws::String GetContentType() const override;
SerializerOutcome SerializeInput(const Schema& schema, const SerializableStruct& input) const override;
Aws::UniquePtr<ShapeDeserializer> CreateOutputDeserializer(Aws::Crt::ByteCursor data) const override;

private:
JsonCodec m_codec;
};

class SMITHY_API AwsJson10Protocol final : public ClientProtocol {
public:
Aws::String GetProtocolId() const override;
Aws::String GetContentType() const override;
SerializerOutcome SerializeInput(const Schema& schema, const SerializableStruct& input) const override;
Aws::UniquePtr<ShapeDeserializer> CreateOutputDeserializer(Aws::Crt::ByteCursor data) const override;

private:
JsonCodec m_codec;
};

class SMITHY_API AwsJson11Protocol final : public ClientProtocol {
public:
Aws::String GetProtocolId() const override;
Aws::String GetContentType() const override;
SerializerOutcome SerializeInput(const Schema& schema, const SerializableStruct& input) const override;
Aws::UniquePtr<ShapeDeserializer> CreateOutputDeserializer(Aws::Crt::ByteCursor data) const override;

private:
JsonCodec m_codec;
};

class SMITHY_API RpcV2CborProtocol final : public ClientProtocol {
public:
Aws::String GetProtocolId() const override;
Aws::String GetContentType() const override;
SerializerOutcome SerializeInput(const Schema& schema, const SerializableStruct& input) const override;
Aws::UniquePtr<ShapeDeserializer> CreateOutputDeserializer(Aws::Crt::ByteCursor data) const override;

private:
CborCodec m_codec;
};

class SMITHY_API RestXmlProtocol final : public ClientProtocol {
public:
Aws::String GetProtocolId() const override;
Aws::String GetContentType() const override;
SerializerOutcome SerializeInput(const Schema& schema, const SerializableStruct& input) const override;
Aws::UniquePtr<ShapeDeserializer> CreateOutputDeserializer(Aws::Crt::ByteCursor data) const override;

private:
XmlCodec m_codec;
};

class SMITHY_API AwsQueryProtocol final : public ClientProtocol {
public:
Aws::String GetProtocolId() const override;
Aws::String GetContentType() const override;
SerializerOutcome SerializeInput(const Schema& schema, const SerializableStruct& input) const override;
Aws::UniquePtr<ShapeDeserializer> CreateOutputDeserializer(Aws::Crt::ByteCursor data) const override;
SerializerOutcome SerializeRequest(const OperationRequestContext& operation, const Schema& inputSchema,
const SerializableStruct& input) const override;
void DeserializeResponse(const OperationRequestContext& operation, Aws::Crt::ByteCursor data,
SerializableStruct& output) const override;
};

class SMITHY_API Ec2QueryProtocol final : public ClientProtocol {
public:
Aws::String GetProtocolId() const override;
Aws::String GetContentType() const override;
SerializerOutcome SerializeInput(const Schema& schema, const SerializableStruct& input) const override;
Aws::UniquePtr<ShapeDeserializer> CreateOutputDeserializer(Aws::Crt::ByteCursor data) const override;
SerializerOutcome SerializeRequest(const OperationRequestContext& operation, const Schema& inputSchema,
const SerializableStruct& input) const override;
};

} // namespace schema
} // namespace smithy
52 changes: 52 additions & 0 deletions src/aws-cpp-sdk-core/include/smithy/client/schema/Codec.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#pragma once

#include <aws/core/client/AWSError.h>
#include <aws/core/client/CoreErrors.h>
#include <aws/core/utils/Outcome.h>
#include <aws/core/utils/memory/AWSMemory.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/crt/Types.h>
#include <smithy/Smithy_EXPORTS.h>
#include <smithy/client/schema/SerializableStruct.h>
#include <smithy/client/schema/ShapeDeserializer.h>

namespace smithy {
namespace schema {

class Schema;

class SMITHY_API Codec {
public:
using SerializerOutcome = Aws::Utils::Outcome<Aws::String, Aws::Client::AWSError<Aws::Client::CoreErrors>>;

virtual ~Codec() = default;

virtual SerializerOutcome Serialize(const Schema& schema, const SerializableStruct& shape) const = 0;

virtual Aws::UniquePtr<ShapeDeserializer> CreateDeserializer(Aws::Crt::ByteCursor data) const = 0;

void DeserializeShape(Aws::Crt::ByteCursor data, SerializableStruct& shape) const {
shape.Deserialize(*CreateDeserializer(data));
}
};

class SMITHY_API JsonCodec final : public Codec {
public:
SerializerOutcome Serialize(const Schema& schema, const SerializableStruct& shape) const override;
Aws::UniquePtr<ShapeDeserializer> CreateDeserializer(Aws::Crt::ByteCursor data) const override;
};

class SMITHY_API XmlCodec final : public Codec {
public:
SerializerOutcome Serialize(const Schema& schema, const SerializableStruct& shape) const override;
Aws::UniquePtr<ShapeDeserializer> CreateDeserializer(Aws::Crt::ByteCursor data) const override;
};

class SMITHY_API CborCodec final : public Codec {
public:
SerializerOutcome Serialize(const Schema& schema, const SerializableStruct& shape) const override;
Aws::UniquePtr<ShapeDeserializer> CreateDeserializer(Aws::Crt::ByteCursor data) const override;
};

} // namespace schema
} // namespace smithy
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,6 @@ class SMITHY_API InterceptingSerializer : public ShapeSerializer {
Before(schema).WriteBlob(schema, value);
After(schema);
}
void WriteEnum(const Schema& schema, int value) override {
Before(schema).WriteEnum(schema, value);
After(schema);
}
void WriteNull(const Schema& schema) override {
Before(schema).WriteNull(schema);
After(schema);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#pragma once

#include <aws/core/utils/memory/AWSMemory.h>
#include <aws/crt/Types.h>
#include <smithy/Smithy_EXPORTS.h>
#include <smithy/client/schema/ShapeDeserializer.h>

namespace smithy {
namespace schema {

class SMITHY_API JsonShapeDeserializer final : public ShapeDeserializer {
public:
explicit JsonShapeDeserializer(Aws::Crt::ByteCursor data);
~JsonShapeDeserializer();

void ReadStruct(const Schema& schema, const StructMemberConsumer& consumer) override;
void ReadList(const Schema& schema, const ListElementConsumer& consumer) override;
void ReadMap(const Schema& schema, const MapEntryConsumer& consumer) override;

Aws::Crt::Optional<bool> ReadBoolean(const Schema& schema) override;
Aws::Crt::Optional<int> ReadInteger(const Schema& schema) override;
Aws::Crt::Optional<int64_t> ReadLong(const Schema& schema) override;
Aws::Crt::Optional<float> ReadFloat(const Schema& schema) override;
Aws::Crt::Optional<double> ReadDouble(const Schema& schema) override;
Aws::Crt::Optional<Aws::String> ReadString(const Schema& schema) override;
Aws::Crt::Optional<Aws::Utils::DateTime> ReadTimestamp(const Schema& schema) override;
Aws::Crt::Optional<Aws::Utils::ByteBuffer> ReadBlob(const Schema& schema) override;

bool IsNull() override;

private:
class Impl;
Aws::UniquePtr<Impl> m_impl;
};

} // namespace schema
} // namespace smithy
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ class SMITHY_API JsonShapeSerializer final : public ShapeSerializer {
void WriteString(const Schema& schema, const Aws::String& value) override;
void WriteTimestamp(const Schema& schema, const Aws::Utils::DateTime& value) override;
void WriteBlob(const Schema& schema, const Aws::Utils::ByteBuffer& value) override;
void WriteEnum(const Schema& schema, int value) override;
void WriteNull(const Schema& schema) override;

SerializerOutcome GetPayload();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#pragma once

#include <aws/core/utils/memory/stl/AWSString.h>
#include <smithy/Smithy_EXPORTS.h>

namespace smithy {
namespace schema {

struct SMITHY_API OperationRequestContext {
Aws::String action;
Aws::String version;
};

} // namespace schema
} // namespace smithy
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#pragma once

#include <aws/core/client/AWSError.h>
#include <aws/core/utils/memory/AWSMemory.h>
#include <smithy/Smithy_EXPORTS.h>
#include <smithy/client/schema/ShapeSerializer.h>

#include <cstdint>
#include <functional>

namespace smithy {
namespace schema {

class SMITHY_API QueryShapeSerializer final : public ShapeSerializer {
public:
using SerializerOutcome = Aws::Utils::Outcome<Aws::String, Aws::Client::AWSError<Aws::Client::CoreErrors>>;

enum class Flavor { AwsQuery, Ec2Query };

QueryShapeSerializer();
explicit QueryShapeSerializer(Flavor flavor);
~QueryShapeSerializer();

void WriteStruct(const Schema& schema, const SerializableStruct& value) override;
void WriteList(const Schema& schema, size_t size, const std::function<void(ShapeSerializer&)>& consumer) override;
void WriteMap(const Schema& schema, size_t size, const std::function<void(MapSerializer&)>& consumer) override;

void WriteBoolean(const Schema& schema, bool value) override;
void WriteInteger(const Schema& schema, int value) override;
void WriteLong(const Schema& schema, int64_t value) override;
void WriteFloat(const Schema& schema, float value) override;
void WriteDouble(const Schema& schema, double value) override;
void WriteString(const Schema& schema, const Aws::String& value) override;
void WriteTimestamp(const Schema& schema, const Aws::Utils::DateTime& value) override;
void WriteBlob(const Schema& schema, const Aws::Utils::ByteBuffer& value) override;
void WriteNull(const Schema& schema) override;

SerializerOutcome GetPayload();

private:
class Impl;
Aws::UniquePtr<Impl> m_impl;
};

} // namespace schema
} // namespace smithy
Loading
Loading