Skip to content

Commit d01ba4d

Browse files
committed
adding the Cbor Deserializer
1 parent 94d5512 commit d01ba4d

4 files changed

Lines changed: 640 additions & 0 deletions

File tree

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#pragma once
2+
3+
#include <aws/core/utils/memory/AWSMemory.h>
4+
#include <smithy/Smithy_EXPORTS.h>
5+
#include <smithy/client/schema/ShapeDeserializer.h>
6+
7+
namespace smithy {
8+
namespace schema {
9+
10+
class SMITHY_API CborShapeDeserializer final : public ShapeDeserializer {
11+
public:
12+
CborShapeDeserializer(const unsigned char* data, size_t length);
13+
~CborShapeDeserializer();
14+
15+
bool ReadBoolean() override;
16+
int ReadInteger() override;
17+
int64_t ReadLong() override;
18+
float ReadFloat() override;
19+
double ReadDouble() override;
20+
Aws::String ReadString() override;
21+
Aws::Utils::DateTime ReadTimestamp() override;
22+
Aws::Utils::ByteBuffer ReadBlob() override;
23+
int ReadEnum() override;
24+
25+
void BeginStruct() override;
26+
void EndStruct() override;
27+
28+
size_t BeginList() override;
29+
void EndList() override;
30+
31+
size_t BeginMap() override;
32+
void EndMap() override;
33+
34+
Aws::String ReadKey() override;
35+
bool IsBreak() override;
36+
bool IsNull() override;
37+
void ReadNull() override;
38+
void SkipValue() override;
39+
40+
private:
41+
class Impl;
42+
Aws::UniquePtr<Impl> m_impl;
43+
};
44+
45+
} // namespace schema
46+
} // namespace smithy
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#pragma once
2+
3+
#include <aws/core/utils/Array.h>
4+
#include <aws/core/utils/DateTime.h>
5+
#include <aws/core/utils/memory/stl/AWSString.h>
6+
#include <smithy/Smithy_EXPORTS.h>
7+
8+
#include <cstdint>
9+
10+
namespace smithy {
11+
namespace schema {
12+
13+
class SMITHY_API ShapeDeserializer {
14+
public:
15+
virtual ~ShapeDeserializer() = default;
16+
17+
virtual bool ReadBoolean() = 0;
18+
virtual int ReadInteger() = 0;
19+
virtual int64_t ReadLong() = 0;
20+
virtual float ReadFloat() = 0;
21+
virtual double ReadDouble() = 0;
22+
virtual Aws::String ReadString() = 0;
23+
virtual Aws::Utils::DateTime ReadTimestamp() = 0;
24+
virtual Aws::Utils::ByteBuffer ReadBlob() = 0;
25+
virtual int ReadEnum() = 0;
26+
27+
virtual void BeginStruct() = 0;
28+
virtual void EndStruct() = 0;
29+
30+
virtual size_t BeginList() = 0;
31+
virtual void EndList() = 0;
32+
33+
virtual size_t BeginMap() = 0;
34+
virtual void EndMap() = 0;
35+
36+
virtual Aws::String ReadKey() = 0;
37+
virtual bool IsBreak() = 0;
38+
virtual bool IsNull() = 0;
39+
virtual void ReadNull() = 0;
40+
virtual void SkipValue() = 0;
41+
};
42+
43+
} // namespace schema
44+
} // namespace smithy
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
/**
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0.
4+
*/
5+
#include <aws/crt/cbor/Cbor.h>
6+
#include <smithy/client/schema/CborShapeDeserializer.h>
7+
8+
using namespace smithy::schema;
9+
using namespace Aws::Utils;
10+
using namespace Aws::Crt::Cbor;
11+
12+
class CborShapeDeserializer::Impl {
13+
public:
14+
Impl(const unsigned char* data, size_t length)
15+
: m_decoder(Aws::Crt::ByteCursorFromArray(data, length)) {}
16+
17+
bool ReadBoolean() {
18+
auto val = m_decoder.PopNextBooleanVal();
19+
return val.has_value() ? val.value() : false;
20+
}
21+
22+
int ReadInteger() { return static_cast<int>(ReadLong()); }
23+
24+
int64_t ReadLong() {
25+
auto type = m_decoder.PeekType();
26+
if (!type.has_value()) {
27+
return 0;
28+
}
29+
if (*type == CborType::UInt) {
30+
auto val = m_decoder.PopNextUnsignedIntVal();
31+
return val.has_value() ? static_cast<int64_t>(val.value()) : 0;
32+
}
33+
if (*type == CborType::NegInt) {
34+
auto val = m_decoder.PopNextNegativeIntVal();
35+
return val.has_value() ? static_cast<int64_t>(-(static_cast<int64_t>(val.value()) + 1)) : 0;
36+
}
37+
return 0;
38+
}
39+
40+
float ReadFloat() { return static_cast<float>(ReadDouble()); }
41+
42+
double ReadDouble() {
43+
auto type = m_decoder.PeekType();
44+
if (!type.has_value()) {
45+
return 0.0;
46+
}
47+
if (*type == CborType::Float) {
48+
auto val = m_decoder.PopNextFloatVal();
49+
return val.has_value() ? val.value() : 0.0;
50+
}
51+
// CRT "smallest possible" may encode doubles as integers
52+
return static_cast<double>(ReadLong());
53+
}
54+
55+
Aws::String ReadString() {
56+
auto val = m_decoder.PopNextTextVal();
57+
if (!val.has_value()) {
58+
return {};
59+
}
60+
return Aws::String(reinterpret_cast<const char*>(val->ptr), val->len);
61+
}
62+
63+
DateTime ReadTimestamp() {
64+
auto tag = m_decoder.PopNextTagVal();
65+
(void)tag;
66+
return DateTime(static_cast<double>(ReadLong()));
67+
}
68+
69+
ByteBuffer ReadBlob() {
70+
auto val = m_decoder.PopNextBytesVal();
71+
if (!val.has_value()) {
72+
return {};
73+
}
74+
return ByteBuffer(val->ptr, val->len);
75+
}
76+
77+
int ReadEnum() { return ReadInteger(); }
78+
79+
void BeginStruct() {
80+
auto type = m_decoder.PeekType();
81+
if (type.has_value() && *type == CborType::IndefMapStart) {
82+
m_decoder.ConsumeNextSingleElement();
83+
} else {
84+
m_decoder.PopNextMapStart();
85+
}
86+
}
87+
88+
void EndStruct() {
89+
// For indefinite maps, the break is consumed by the IsBreak/read loop
90+
}
91+
92+
size_t BeginList() {
93+
auto type = m_decoder.PeekType();
94+
if (type.has_value() && *type == CborType::IndefArrayStart) {
95+
m_decoder.ConsumeNextSingleElement();
96+
return 0;
97+
}
98+
auto size = m_decoder.PopNextArrayStart();
99+
return size.has_value() ? static_cast<size_t>(size.value()) : 0;
100+
}
101+
102+
void EndList() {}
103+
104+
size_t BeginMap() {
105+
auto type = m_decoder.PeekType();
106+
if (type.has_value() && *type == CborType::IndefMapStart) {
107+
m_decoder.ConsumeNextSingleElement();
108+
return 0;
109+
}
110+
auto size = m_decoder.PopNextMapStart();
111+
return size.has_value() ? static_cast<size_t>(size.value()) : 0;
112+
}
113+
114+
void EndMap() {}
115+
116+
Aws::String ReadKey() { return ReadString(); }
117+
118+
bool IsBreak() {
119+
auto type = m_decoder.PeekType();
120+
return type.has_value() && *type == CborType::Break;
121+
}
122+
123+
bool IsNull() {
124+
auto type = m_decoder.PeekType();
125+
return type.has_value() && *type == CborType::Null;
126+
}
127+
128+
void ReadNull() { m_decoder.ConsumeNextSingleElement(); }
129+
130+
void SkipValue() { m_decoder.ConsumeNextWholeDataItem(); }
131+
132+
private:
133+
CborDecoder m_decoder;
134+
};
135+
136+
CborShapeDeserializer::CborShapeDeserializer(const unsigned char* data, size_t length)
137+
: m_impl(Aws::MakeUnique<Impl>("CborShapeDeserializer", data, length)) {}
138+
CborShapeDeserializer::~CborShapeDeserializer() = default;
139+
140+
bool CborShapeDeserializer::ReadBoolean() { return m_impl->ReadBoolean(); }
141+
int CborShapeDeserializer::ReadInteger() { return m_impl->ReadInteger(); }
142+
int64_t CborShapeDeserializer::ReadLong() { return m_impl->ReadLong(); }
143+
float CborShapeDeserializer::ReadFloat() { return m_impl->ReadFloat(); }
144+
double CborShapeDeserializer::ReadDouble() { return m_impl->ReadDouble(); }
145+
Aws::String CborShapeDeserializer::ReadString() { return m_impl->ReadString(); }
146+
DateTime CborShapeDeserializer::ReadTimestamp() { return m_impl->ReadTimestamp(); }
147+
ByteBuffer CborShapeDeserializer::ReadBlob() { return m_impl->ReadBlob(); }
148+
int CborShapeDeserializer::ReadEnum() { return m_impl->ReadEnum(); }
149+
void CborShapeDeserializer::BeginStruct() { m_impl->BeginStruct(); }
150+
void CborShapeDeserializer::EndStruct() { m_impl->EndStruct(); }
151+
size_t CborShapeDeserializer::BeginList() { return m_impl->BeginList(); }
152+
void CborShapeDeserializer::EndList() { m_impl->EndList(); }
153+
size_t CborShapeDeserializer::BeginMap() { return m_impl->BeginMap(); }
154+
void CborShapeDeserializer::EndMap() { m_impl->EndMap(); }
155+
Aws::String CborShapeDeserializer::ReadKey() { return m_impl->ReadKey(); }
156+
bool CborShapeDeserializer::IsBreak() { return m_impl->IsBreak(); }
157+
bool CborShapeDeserializer::IsNull() { return m_impl->IsNull(); }
158+
void CborShapeDeserializer::ReadNull() { m_impl->ReadNull(); }
159+
void CborShapeDeserializer::SkipValue() { m_impl->SkipValue(); }

0 commit comments

Comments
 (0)