Skip to content

Commit 713da49

Browse files
feat: implement oneof for data models (#3518)
1 parent be6963f commit 713da49

20 files changed

+396
-198
lines changed

Source/ImmutablezkEVMAPI/Private/APIActivityAsset.cpp

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,33 @@ namespace ImmutablezkEVMAPI
2222

2323
void APIActivityAsset::WriteJson(JsonWriter& Writer) const
2424
{
25-
Writer->WriteObjectStart();
26-
Writer->WriteIdentifierPrefix(TEXT("contract_type")); WriteJsonValue(Writer, ContractType);
27-
Writer->WriteIdentifierPrefix(TEXT("contract_address")); WriteJsonValue(Writer, ContractAddress);
28-
Writer->WriteIdentifierPrefix(TEXT("token_id")); WriteJsonValue(Writer, TokenId);
29-
Writer->WriteIdentifierPrefix(TEXT("amount")); WriteJsonValue(Writer, Amount);
30-
Writer->WriteObjectEnd();
25+
if (const APIActivityNFT* APIActivityNFTValue = OneOf.TryGet<APIActivityNFT>())
26+
{
27+
WriteJsonValue(Writer, *APIActivityNFTValue);
28+
}
29+
else if (const APIActivityToken* APIActivityTokenValue = OneOf.TryGet<APIActivityToken>())
30+
{
31+
WriteJsonValue(Writer, *APIActivityTokenValue);
32+
}
3133
}
3234

3335
bool APIActivityAsset::FromJson(const TSharedPtr<FJsonValue>& JsonValue)
3436
{
35-
const TSharedPtr<FJsonObject>* Object;
36-
if (!JsonValue->TryGetObject(Object))
37-
return false;
38-
39-
bool ParseSuccess = true;
40-
41-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("contract_type"), ContractType);
42-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("contract_address"), ContractAddress);
43-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("token_id"), TokenId);
44-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("amount"), Amount);
45-
46-
return ParseSuccess;
37+
APIActivityNFT APIActivityNFTValue;
38+
if (const bool bIsAPIActivityNFT = TryGetJsonValue(JsonValue, APIActivityNFTValue))
39+
{
40+
OneOf.Set<APIActivityNFT>(APIActivityNFTValue);
41+
return true;
42+
}
43+
44+
APIActivityToken APIActivityTokenValue;
45+
if (const bool bIsAPIActivityToken = TryGetJsonValue(JsonValue, APIActivityTokenValue))
46+
{
47+
OneOf.Set<APIActivityToken>(APIActivityTokenValue);
48+
return true;
49+
}
50+
51+
return false;
4752
}
4853

4954
}

Source/ImmutablezkEVMAPI/Private/APIActivityDetails.cpp

Lines changed: 64 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,32 +22,77 @@ namespace ImmutablezkEVMAPI
2222

2323
void APIActivityDetails::WriteJson(JsonWriter& Writer) const
2424
{
25-
Writer->WriteObjectStart();
26-
Writer->WriteIdentifierPrefix(TEXT("to")); WriteJsonValue(Writer, To);
27-
Writer->WriteIdentifierPrefix(TEXT("amount")); WriteJsonValue(Writer, Amount);
28-
Writer->WriteIdentifierPrefix(TEXT("asset")); WriteJsonValue(Writer, Asset);
29-
Writer->WriteIdentifierPrefix(TEXT("from")); WriteJsonValue(Writer, From);
30-
Writer->WriteIdentifierPrefix(TEXT("order_id")); WriteJsonValue(Writer, OrderId);
31-
Writer->WriteIdentifierPrefix(TEXT("payment")); WriteJsonValue(Writer, Payment);
32-
Writer->WriteObjectEnd();
25+
if (const APIBurn* APIBurnValue = OneOf.TryGet<APIBurn>())
26+
{
27+
WriteJsonValue(Writer, *APIBurnValue);
28+
}
29+
else if (const APIDeposit* APIDepositValue = OneOf.TryGet<APIDeposit>())
30+
{
31+
WriteJsonValue(Writer, *APIDepositValue);
32+
}
33+
else if (const APIMint* APIMintValue = OneOf.TryGet<APIMint>())
34+
{
35+
WriteJsonValue(Writer, *APIMintValue);
36+
}
37+
else if (const APINFTSale* APINFTSaleValue = OneOf.TryGet<APINFTSale>())
38+
{
39+
WriteJsonValue(Writer, *APINFTSaleValue);
40+
}
41+
else if (const APITransfer* APITransferValue = OneOf.TryGet<APITransfer>())
42+
{
43+
WriteJsonValue(Writer, *APITransferValue);
44+
}
45+
else if (const APIWithdrawal* APIWithdrawalValue = OneOf.TryGet<APIWithdrawal>())
46+
{
47+
WriteJsonValue(Writer, *APIWithdrawalValue);
48+
}
3349
}
3450

3551
bool APIActivityDetails::FromJson(const TSharedPtr<FJsonValue>& JsonValue)
3652
{
37-
const TSharedPtr<FJsonObject>* Object;
38-
if (!JsonValue->TryGetObject(Object))
39-
return false;
53+
APIBurn APIBurnValue;
54+
if (const bool bIsAPIBurn = TryGetJsonValue(JsonValue, APIBurnValue))
55+
{
56+
OneOf.Set<APIBurn>(APIBurnValue);
57+
return true;
58+
}
4059

41-
bool ParseSuccess = true;
60+
APIDeposit APIDepositValue;
61+
if (const bool bIsAPIDeposit = TryGetJsonValue(JsonValue, APIDepositValue))
62+
{
63+
OneOf.Set<APIDeposit>(APIDepositValue);
64+
return true;
65+
}
4266

43-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("to"), To);
44-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("amount"), Amount);
45-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("asset"), Asset);
46-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("from"), From);
47-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("order_id"), OrderId);
48-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("payment"), Payment);
67+
APIMint APIMintValue;
68+
if (const bool bIsAPIMint = TryGetJsonValue(JsonValue, APIMintValue))
69+
{
70+
OneOf.Set<APIMint>(APIMintValue);
71+
return true;
72+
}
4973

50-
return ParseSuccess;
74+
APINFTSale APINFTSaleValue;
75+
if (const bool bIsAPINFTSale = TryGetJsonValue(JsonValue, APINFTSaleValue))
76+
{
77+
OneOf.Set<APINFTSale>(APINFTSaleValue);
78+
return true;
79+
}
80+
81+
APITransfer APITransferValue;
82+
if (const bool bIsAPITransfer = TryGetJsonValue(JsonValue, APITransferValue))
83+
{
84+
OneOf.Set<APITransfer>(APITransferValue);
85+
return true;
86+
}
87+
88+
APIWithdrawal APIWithdrawalValue;
89+
if (const bool bIsAPIWithdrawal = TryGetJsonValue(JsonValue, APIWithdrawalValue))
90+
{
91+
OneOf.Set<APIWithdrawal>(APIWithdrawalValue);
92+
return true;
93+
}
94+
95+
return false;
5196
}
5297

5398
}

Source/ImmutablezkEVMAPI/Private/APIAssetCollectionItem.cpp

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,26 +75,33 @@ inline bool TryGetJsonValue(const TSharedPtr<FJsonValue>& JsonValue, APIAssetCol
7575

7676
void APIAssetCollectionItem::WriteJson(JsonWriter& Writer) const
7777
{
78-
Writer->WriteObjectStart();
79-
Writer->WriteIdentifierPrefix(TEXT("type")); WriteJsonValue(Writer, Type);
80-
Writer->WriteIdentifierPrefix(TEXT("contract_address")); WriteJsonValue(Writer, ContractAddress);
81-
Writer->WriteIdentifierPrefix(TEXT("amount")); WriteJsonValue(Writer, Amount);
82-
Writer->WriteObjectEnd();
78+
if (const APIERC1155CollectionItem* APIERC1155CollectionItemValue = OneOf.TryGet<APIERC1155CollectionItem>())
79+
{
80+
WriteJsonValue(Writer, *APIERC1155CollectionItemValue);
81+
}
82+
else if (const APIERC721CollectionItem* APIERC721CollectionItemValue = OneOf.TryGet<APIERC721CollectionItem>())
83+
{
84+
WriteJsonValue(Writer, *APIERC721CollectionItemValue);
85+
}
8386
}
8487

8588
bool APIAssetCollectionItem::FromJson(const TSharedPtr<FJsonValue>& JsonValue)
8689
{
87-
const TSharedPtr<FJsonObject>* Object;
88-
if (!JsonValue->TryGetObject(Object))
89-
return false;
90-
91-
bool ParseSuccess = true;
90+
APIERC1155CollectionItem APIERC1155CollectionItemValue;
91+
if (const bool bIsAPIERC1155CollectionItem = TryGetJsonValue(JsonValue, APIERC1155CollectionItemValue))
92+
{
93+
OneOf.Set<APIERC1155CollectionItem>(APIERC1155CollectionItemValue);
94+
return true;
95+
}
9296

93-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("type"), Type);
94-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("contract_address"), ContractAddress);
95-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("amount"), Amount);
97+
APIERC721CollectionItem APIERC721CollectionItemValue;
98+
if (const bool bIsAPIERC721CollectionItem = TryGetJsonValue(JsonValue, APIERC721CollectionItemValue))
99+
{
100+
OneOf.Set<APIERC721CollectionItem>(APIERC721CollectionItemValue);
101+
return true;
102+
}
96103

97-
return ParseSuccess;
104+
return false;
98105
}
99106

100107
}

Source/ImmutablezkEVMAPI/Private/APIItem.cpp

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -87,28 +87,77 @@ inline bool TryGetJsonValue(const TSharedPtr<FJsonValue>& JsonValue, APIItem::Ty
8787

8888
void APIItem::WriteJson(JsonWriter& Writer) const
8989
{
90-
Writer->WriteObjectStart();
91-
Writer->WriteIdentifierPrefix(TEXT("type")); WriteJsonValue(Writer, Type);
92-
Writer->WriteIdentifierPrefix(TEXT("amount")); WriteJsonValue(Writer, Amount);
93-
Writer->WriteIdentifierPrefix(TEXT("contract_address")); WriteJsonValue(Writer, ContractAddress);
94-
Writer->WriteIdentifierPrefix(TEXT("token_id")); WriteJsonValue(Writer, TokenId);
95-
Writer->WriteObjectEnd();
90+
if (const APIERC1155CollectionItem* APIERC1155CollectionItemValue = OneOf.TryGet<APIERC1155CollectionItem>())
91+
{
92+
WriteJsonValue(Writer, *APIERC1155CollectionItemValue);
93+
}
94+
else if (const APIERC1155Item* APIERC1155ItemValue = OneOf.TryGet<APIERC1155Item>())
95+
{
96+
WriteJsonValue(Writer, *APIERC1155ItemValue);
97+
}
98+
else if (const APIERC20Item* APIERC20ItemValue = OneOf.TryGet<APIERC20Item>())
99+
{
100+
WriteJsonValue(Writer, *APIERC20ItemValue);
101+
}
102+
else if (const APIERC721CollectionItem* APIERC721CollectionItemValue = OneOf.TryGet<APIERC721CollectionItem>())
103+
{
104+
WriteJsonValue(Writer, *APIERC721CollectionItemValue);
105+
}
106+
else if (const APIERC721Item* APIERC721ItemValue = OneOf.TryGet<APIERC721Item>())
107+
{
108+
WriteJsonValue(Writer, *APIERC721ItemValue);
109+
}
110+
else if (const APINativeItem* APINativeItemValue = OneOf.TryGet<APINativeItem>())
111+
{
112+
WriteJsonValue(Writer, *APINativeItemValue);
113+
}
96114
}
97115

98116
bool APIItem::FromJson(const TSharedPtr<FJsonValue>& JsonValue)
99117
{
100-
const TSharedPtr<FJsonObject>* Object;
101-
if (!JsonValue->TryGetObject(Object))
102-
return false;
118+
APIERC1155CollectionItem APIERC1155CollectionItemValue;
119+
if (const bool bIsAPIERC1155CollectionItem = TryGetJsonValue(JsonValue, APIERC1155CollectionItemValue))
120+
{
121+
OneOf.Set<APIERC1155CollectionItem>(APIERC1155CollectionItemValue);
122+
return true;
123+
}
103124

104-
bool ParseSuccess = true;
125+
APIERC1155Item APIERC1155ItemValue;
126+
if (const bool bIsAPIERC1155Item = TryGetJsonValue(JsonValue, APIERC1155ItemValue))
127+
{
128+
OneOf.Set<APIERC1155Item>(APIERC1155ItemValue);
129+
return true;
130+
}
131+
132+
APIERC20Item APIERC20ItemValue;
133+
if (const bool bIsAPIERC20Item = TryGetJsonValue(JsonValue, APIERC20ItemValue))
134+
{
135+
OneOf.Set<APIERC20Item>(APIERC20ItemValue);
136+
return true;
137+
}
138+
139+
APIERC721CollectionItem APIERC721CollectionItemValue;
140+
if (const bool bIsAPIERC721CollectionItem = TryGetJsonValue(JsonValue, APIERC721CollectionItemValue))
141+
{
142+
OneOf.Set<APIERC721CollectionItem>(APIERC721CollectionItemValue);
143+
return true;
144+
}
105145

106-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("type"), Type);
107-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("amount"), Amount);
108-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("contract_address"), ContractAddress);
109-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("token_id"), TokenId);
146+
APIERC721Item APIERC721ItemValue;
147+
if (const bool bIsAPIERC721Item = TryGetJsonValue(JsonValue, APIERC721ItemValue))
148+
{
149+
OneOf.Set<APIERC721Item>(APIERC721ItemValue);
150+
return true;
151+
}
110152

111-
return ParseSuccess;
153+
APINativeItem APINativeItemValue;
154+
if (const bool bIsAPINativeItem = TryGetJsonValue(JsonValue, APINativeItemValue))
155+
{
156+
OneOf.Set<APINativeItem>(APINativeItemValue);
157+
return true;
158+
}
159+
160+
return false;
112161
}
113162

114163
}

Source/ImmutablezkEVMAPI/Private/APIMarketPriceDetailsToken.cpp

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -75,34 +75,33 @@ inline bool TryGetJsonValue(const TSharedPtr<FJsonValue>& JsonValue, APIMarketPr
7575

7676
void APIMarketPriceDetailsToken::WriteJson(JsonWriter& Writer) const
7777
{
78-
Writer->WriteObjectStart();
79-
Writer->WriteIdentifierPrefix(TEXT("type")); WriteJsonValue(Writer, Type);
80-
if (Symbol.IsSet())
78+
if (const APIMarketPriceERC20Token* APIMarketPriceERC20TokenValue = OneOf.TryGet<APIMarketPriceERC20Token>())
8179
{
82-
Writer->WriteIdentifierPrefix(TEXT("symbol")); WriteJsonValue(Writer, Symbol.GetValue());
80+
WriteJsonValue(Writer, *APIMarketPriceERC20TokenValue);
8381
}
84-
Writer->WriteIdentifierPrefix(TEXT("contract_address")); WriteJsonValue(Writer, ContractAddress);
85-
if (Decimals.IsSet())
82+
else if (const APIMarketPriceNativeToken* APIMarketPriceNativeTokenValue = OneOf.TryGet<APIMarketPriceNativeToken>())
8683
{
87-
Writer->WriteIdentifierPrefix(TEXT("decimals")); WriteJsonValue(Writer, Decimals.GetValue());
84+
WriteJsonValue(Writer, *APIMarketPriceNativeTokenValue);
8885
}
89-
Writer->WriteObjectEnd();
9086
}
9187

9288
bool APIMarketPriceDetailsToken::FromJson(const TSharedPtr<FJsonValue>& JsonValue)
9389
{
94-
const TSharedPtr<FJsonObject>* Object;
95-
if (!JsonValue->TryGetObject(Object))
96-
return false;
97-
98-
bool ParseSuccess = true;
90+
APIMarketPriceERC20Token APIMarketPriceERC20TokenValue;
91+
if (const bool bIsAPIMarketPriceERC20Token = TryGetJsonValue(JsonValue, APIMarketPriceERC20TokenValue))
92+
{
93+
OneOf.Set<APIMarketPriceERC20Token>(APIMarketPriceERC20TokenValue);
94+
return true;
95+
}
9996

100-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("type"), Type);
101-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("symbol"), Symbol);
102-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("contract_address"), ContractAddress);
103-
ParseSuccess &= TryGetJsonValue(*Object, TEXT("decimals"), Decimals);
97+
APIMarketPriceNativeToken APIMarketPriceNativeTokenValue;
98+
if (const bool bIsAPIMarketPriceNativeToken = TryGetJsonValue(JsonValue, APIMarketPriceNativeTokenValue))
99+
{
100+
OneOf.Set<APIMarketPriceNativeToken>(APIMarketPriceNativeTokenValue);
101+
return true;
102+
}
104103

105-
return ParseSuccess;
104+
return false;
106105
}
107106

108107
}

Source/ImmutablezkEVMAPI/Private/APINFTMetadataAttributeValue.cpp

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,44 @@ namespace ImmutablezkEVMAPI
2222

2323
void APINFTMetadataAttributeValue::WriteJson(JsonWriter& Writer) const
2424
{
25-
Writer->WriteObjectStart();
26-
Writer->WriteObjectEnd();
25+
if (const FString* FStringValue = OneOf.TryGet<FString>())
26+
{
27+
WriteJsonValue(Writer, *FStringValue);
28+
}
29+
else if (const bool* BoolValue = OneOf.TryGet<bool>())
30+
{
31+
WriteJsonValue(Writer, *BoolValue);
32+
}
33+
else if (const double* DoubleValue = OneOf.TryGet<double>())
34+
{
35+
WriteJsonValue(Writer, *DoubleValue);
36+
}
2737
}
2838

2939
bool APINFTMetadataAttributeValue::FromJson(const TSharedPtr<FJsonValue>& JsonValue)
3040
{
31-
const TSharedPtr<FJsonObject>* Object;
32-
if (!JsonValue->TryGetObject(Object))
33-
return false;
41+
FString FStringValue;
42+
if (const bool bIsFString = TryGetJsonValue(JsonValue, FStringValue))
43+
{
44+
OneOf.Set<FString>(FStringValue);
45+
return true;
46+
}
3447

35-
bool ParseSuccess = true;
48+
bool BoolValue;
49+
if (const bool bIsBool = TryGetJsonValue(JsonValue, BoolValue))
50+
{
51+
OneOf.Set<bool>(BoolValue);
52+
return true;
53+
}
3654

55+
double DoubleValue;
56+
if (const bool bIsDouble = TryGetJsonValue(JsonValue, DoubleValue))
57+
{
58+
OneOf.Set<double>(DoubleValue);
59+
return true;
60+
}
3761

38-
return ParseSuccess;
62+
return false;
3963
}
4064

4165
}

0 commit comments

Comments
 (0)