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
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
#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>

namespace smithy {
namespace schema {

class SMITHY_API CborShapeSerialize final : public ShapeSerializer {
class SMITHY_API CborShapeSerializer final : public ShapeSerializer {
public:
using SerializerOutcome = Aws::Utils::Outcome<Aws::String, Aws::Client::AWSError<Aws::Client::CoreErrors>>;
CborShapeSerializer();
~CborShapeSerializer();

Expand All @@ -18,6 +20,7 @@ class SMITHY_API CborShapeSerialize final : public ShapeSerializer {
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;
Expand All @@ -35,7 +38,7 @@ class SMITHY_API CborShapeSerialize final : public ShapeSerializer {
bool BeginNestedStructure(const Schema& schema) override;
void EndNestedStructure() override;

Aws::String GetPayload() const;
SerializerOutcome GetPayload();

private:
class Impl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class SMITHY_API JsonShapeSerializer final : public ShapeSerializer {
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;
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class SMITHY_API ShapeSerializer {
virtual void WriteBoolean(const Schema& schema, bool value) = 0;
virtual void WriteInteger(const Schema& schema, int value) = 0;
virtual void WriteLong(const Schema& schema, int64_t value) = 0;
virtual void WriteFloat(const Schema& schema, float value) = 0;
virtual void WriteDouble(const Schema& schema, double value) = 0;
virtual void WriteString(const Schema& schema, const Aws::String& value) = 0;
virtual void WriteTimestamp(const Schema& schema, const Aws::Utils::DateTime& value) = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class SMITHY_API XmlShapeSerializer final : public ShapeSerializer {
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;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include <aws/core/client/AWSClient.h>
#include <aws/core/utils/Outcome.h>
#include <aws/crt/cbor/Cbor.h>
#include <smithy/client/schema/CborShapeSerializer.h>

using namespace smithy::schema;
using namespace Aws::Utils;
using SerializerOutcome = Aws::Utils::Outcome<Aws::String, Aws::Client::AWSError<Aws::Client::CoreErrors>>;

class CborShapeSerializer::Impl {
public:
bool BeginStructure(const Schema&) {
m_encoder.WriteIndefMapStart();
return true;
}

void EndStructure() { m_encoder.WriteBreak(); }

void WriteBoolean(const Schema&, bool value) { m_encoder.WriteBool(value); }

void WriteInteger(const Schema&, int value) { WriteIntValue(value); }

void WriteLong(const Schema&, int64_t value) { WriteIntValue(value); }

void WriteFloat(const Schema&, float value) { m_encoder.WriteFloat(value); }

void WriteDouble(const Schema&, double value) { m_encoder.WriteFloat(value); }

void WriteString(const Schema&, const Aws::String& value) { WriteText(value); }

void WriteTimestamp(const Schema&, const DateTime& value) {
m_encoder.WriteTag(1);
WriteIntValue(value.Seconds());
}

void WriteBlob(const Schema&, const ByteBuffer& value) {
m_encoder.WriteBytes(Aws::Crt::ByteCursorFromArray(value.GetUnderlyingData(), value.GetLength()));
}

void WriteEnum(const Schema& schema, int value) { WriteInteger(schema, value); }

void WriteNull(const Schema&) { m_encoder.WriteNull(); }

bool BeginList(const Schema&, size_t count) {
m_encoder.WriteArrayStart(count);
return true;
}

void EndList() {}

bool BeginMap(const Schema&, size_t count) {
m_encoder.WriteMapStart(count);
return true;
}

void WriteMapKey(const Aws::String& key) { WriteText(key); }

void EndMap() {}

bool BeginNestedStructure(const Schema&) {
m_encoder.WriteIndefMapStart();
return true;
}

void EndNestedStructure() { m_encoder.WriteBreak(); }

SerializerOutcome GetPayload() {
if (m_finalized) {
return Aws::Client::AWSError<Aws::Client::CoreErrors>(
Aws::Client::CoreErrors::INTERNAL_FAILURE, "SerializationException",
"Serializer has already been finalized", false);
}
m_finalized = true;
auto encoded = m_encoder.GetEncodedData();
return Aws::String(reinterpret_cast<const char*>(encoded.ptr), encoded.len);
}

private:
Aws::Crt::Cbor::CborEncoder m_encoder;
bool m_finalized = false;

void WriteText(const Aws::String& str) {
m_encoder.WriteText(Aws::Crt::ByteCursorFromArray(reinterpret_cast<const uint8_t*>(str.data()), str.size()));
}

void WriteIntValue(int64_t value) {
if (value >= 0) {
m_encoder.WriteUInt(static_cast<uint64_t>(value));
} else {
m_encoder.WriteNegInt(static_cast<uint64_t>(-(value + 1)));
}
}
};

CborShapeSerializer::CborShapeSerializer() : m_impl(Aws::MakeUnique<Impl>("CborShapeSerializer")) {}
CborShapeSerializer::~CborShapeSerializer() = default;

bool CborShapeSerializer::BeginStructure(const Schema& schema) { return m_impl->BeginStructure(schema); }
void CborShapeSerializer::EndStructure() { m_impl->EndStructure(); }
void CborShapeSerializer::WriteBoolean(const Schema& schema, bool value) { m_impl->WriteBoolean(schema, value); }
void CborShapeSerializer::WriteInteger(const Schema& schema, int value) { m_impl->WriteInteger(schema, value); }
void CborShapeSerializer::WriteLong(const Schema& schema, int64_t value) { m_impl->WriteLong(schema, value); }
void CborShapeSerializer::WriteFloat(const Schema& schema, float value) { m_impl->WriteFloat(schema, value); }
void CborShapeSerializer::WriteDouble(const Schema& schema, double value) { m_impl->WriteDouble(schema, value); }
void CborShapeSerializer::WriteString(const Schema& schema, const Aws::String& value) { m_impl->WriteString(schema, value); }
void CborShapeSerializer::WriteTimestamp(const Schema& schema, const DateTime& value) { m_impl->WriteTimestamp(schema, value); }
void CborShapeSerializer::WriteBlob(const Schema& schema, const ByteBuffer& value) { m_impl->WriteBlob(schema, value); }
void CborShapeSerializer::WriteEnum(const Schema& schema, int value) { m_impl->WriteEnum(schema, value); }
void CborShapeSerializer::WriteNull(const Schema& schema) { m_impl->WriteNull(schema); }
bool CborShapeSerializer::BeginList(const Schema& schema, size_t count) { return m_impl->BeginList(schema, count); }
void CborShapeSerializer::EndList() { m_impl->EndList(); }
bool CborShapeSerializer::BeginMap(const Schema& schema, size_t count) { return m_impl->BeginMap(schema, count); }
void CborShapeSerializer::WriteMapKey(const Aws::String& key) { m_impl->WriteMapKey(key); }
void CborShapeSerializer::EndMap() { m_impl->EndMap(); }
bool CborShapeSerializer::BeginNestedStructure(const Schema& schema) { return m_impl->BeginNestedStructure(schema); }
void CborShapeSerializer::EndNestedStructure() { m_impl->EndNestedStructure(); }
CborShapeSerializer::SerializerOutcome CborShapeSerializer::GetPayload() { return m_impl->GetPayload(); }
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,11 @@ class JsonShapeSerializer::Impl {
m_buf += StringUtils::to_string(value);
}

void WriteFloat(const Schema& schema, float value) {
WriteFieldName(schema);
m_buf += StringUtils::to_string(value);
}

void WriteDouble(const Schema& schema, double value) {
WriteFieldName(schema);
m_buf += StringUtils::to_string(value);
Expand Down Expand Up @@ -208,6 +213,7 @@ void JsonShapeSerializer::EndStructure() { m_impl->EndStructure(); }
void JsonShapeSerializer::WriteBoolean(const Schema& schema, bool value) { m_impl->WriteBoolean(schema, value); }
void JsonShapeSerializer::WriteInteger(const Schema& schema, int value) { m_impl->WriteInteger(schema, value); }
void JsonShapeSerializer::WriteLong(const Schema& schema, int64_t value) { m_impl->WriteLong(schema, value); }
void JsonShapeSerializer::WriteFloat(const Schema& schema, float value) { m_impl->WriteFloat(schema, value); }
void JsonShapeSerializer::WriteDouble(const Schema& schema, double value) { m_impl->WriteDouble(schema, value); }
void JsonShapeSerializer::WriteString(const Schema& schema, const Aws::String& value) { m_impl->WriteString(schema, value); }
void JsonShapeSerializer::WriteTimestamp(const Schema& schema, const DateTime& value) { m_impl->WriteTimestamp(schema, value); }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ class XmlShapeSerializer::Impl {

void WriteLong(const Schema& schema, int64_t value) { WrapValue(GetXmlName(schema), StringUtils::to_string(value)); }

void WriteFloat(const Schema& schema, float value) { WrapValue(GetXmlName(schema), StringUtils::to_string(value)); }

void WriteDouble(const Schema& schema, double value) { WrapValue(GetXmlName(schema), StringUtils::to_string(value)); }

void WriteString(const Schema& schema, const Aws::String& value) { WrapEscapedValue(GetXmlName(schema), value); }
Expand Down Expand Up @@ -392,6 +394,7 @@ void XmlShapeSerializer::EndStructure() { m_impl->EndStructure(); }
void XmlShapeSerializer::WriteBoolean(const Schema& schema, bool value) { m_impl->WriteBoolean(schema, value); }
void XmlShapeSerializer::WriteInteger(const Schema& schema, int value) { m_impl->WriteInteger(schema, value); }
void XmlShapeSerializer::WriteLong(const Schema& schema, int64_t value) { m_impl->WriteLong(schema, value); }
void XmlShapeSerializer::WriteFloat(const Schema& schema, float value) { m_impl->WriteFloat(schema, value); }
void XmlShapeSerializer::WriteDouble(const Schema& schema, double value) { m_impl->WriteDouble(schema, value); }
void XmlShapeSerializer::WriteString(const Schema& schema, const Aws::String& value) { m_impl->WriteString(schema, value); }
void XmlShapeSerializer::WriteTimestamp(const Schema& schema, const DateTime& value) { m_impl->WriteTimestamp(schema, value); }
Expand Down
Loading
Loading