Stream Chat Unreal SDK
Loading...
Searching...
No Matches
AdditionalFields.h
1// Copyright 2022 Stream.IO, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Detail/JsonObjectDeserialization.h"
7#include "Dom/JsonValue.h"
8#include "Kismet/BlueprintFunctionLibrary.h"
9#include "StreamJson.h"
10
11#include "AdditionalFields.generated.h"
12
13USTRUCT(BlueprintType)
14struct STREAMJSON_API FAdditionalFields
15{
16 GENERATED_BODY()
17
18public:
19 void SetString(const FName& Field, const FString& Value);
20 void SetString(const FName& Field, const TCHAR* Value);
21 void SetBool(const FName& Field, bool bValue);
22 void SetJsonValue(const FName& Field, const TSharedRef<FJsonValue>&);
23 template <class T>
24 void SetNumber(const FName& Field, T Value);
25 template <class T>
26 void SetArray(const FName& Field, const TArray<T>& Value);
28 template <class T>
29 void Set(const FName& Field, const T& Value);
30
31 TOptional<FString> GetString(const FName& Field) const;
32 TOptional<bool> GetBool(const FName& Field) const;
33 template <class T>
34 TOptional<T> GetNumber(const FName& Field) const;
36 template <class T>
37 TOptional<T> Get(const FName& Field) const;
38
39 const TMap<FName, TSharedPtr<FJsonValue>>& GetFields() const;
40
41 static FAdditionalFields* FromProperty(void* Struct, FProperty* Property);
42 static const FAdditionalFields* FromProperty(const void* Struct, FProperty* Property);
43
44private:
45 TMap<FName, TSharedPtr<FJsonValue>> Inner;
46};
47
48// General implementation for all number types
49template <class T>
50void FAdditionalFields::SetNumber(const FName& Field, T Value)
51{
52 Inner.Add(Field, MakeShared<FJsonValueNumber>(Value));
53}
54
55template <class T>
56void FAdditionalFields::Set(const FName& Field, const T& Value)
57{
58 const TSharedRef<FJsonObject> Object = JsonObject::UStructToJsonObject<T>(Value);
59 Inner.Add(Field, MakeShared<FJsonValueObject>(Object));
60}
61
62template <class T>
63void FAdditionalFields::SetArray(const FName& Field, const TArray<T>& Value)
64{
65 TArray<TSharedPtr<FJsonValue>> JsonValues;
66 JsonValues.Reserve(Value.Num());
67 for (const T& Elem : Value)
68 {
69 const TSharedRef<FJsonObject> JsonObject = JsonObject::UStructToJsonObject<T>(Elem);
70 JsonValues.Add(MakeShared<FJsonValueObject>(JsonObject));
71 }
72 Inner.Add(Field, MakeShared<FJsonValueArray>(JsonValues));
73}
74
75template <class T>
76TOptional<T> FAdditionalFields::GetNumber(const FName& Field) const
77{
78 if (const TSharedPtr<FJsonValue>* JsonValue = Inner.Find(Field))
79 {
80 T OutNumber;
81 if (JsonValue->Get()->TryGetNumber(OutNumber))
82 {
83 return {OutNumber};
84 }
85 }
86 return {};
87}
88
89template <class T>
90TOptional<T> FAdditionalFields::Get(const FName& Field) const
91{
92 if (const TSharedPtr<FJsonValue>* JsonValue = Inner.Find(Field))
93 {
94 const TSharedPtr<FJsonObject>* OutObject;
95 if (JsonValue->Get()->TryGetObject(OutObject))
96 {
97 T OutStruct;
98 if (JsonObjectDeserialization::JsonObjectToUStruct(OutObject->ToSharedRef(), &OutStruct))
99 {
100 return {OutStruct};
101 }
102 }
103 }
104 return {};
105}
106
107template <>
108TOptional<FDateTime> STREAMJSON_API FAdditionalFields::Get(const FName& Field) const;
109template <>
110void STREAMJSON_API FAdditionalFields::Set(const FName& Field, const FDateTime&);
111
116UCLASS()
117class STREAMJSON_API UAdditionalFieldsBlueprintLibrary final : public UBlueprintFunctionLibrary
118{
119 GENERATED_BODY()
120
121public:
122 UFUNCTION(BlueprintPure, Category = "Stream Chat|Additional Fields")
123 static void SetString(UPARAM(ref) FAdditionalFields& AdditionalFields, FName Field, const FString& Value, FAdditionalFields& Out);
124 UFUNCTION(BlueprintPure, Category = "Stream Chat|Additional Fields")
125 static void SetFloat(UPARAM(ref) FAdditionalFields& AdditionalFields, FName Field, float Value, FAdditionalFields& Out);
126 UFUNCTION(BlueprintPure, Category = "Stream Chat|Additional Fields")
127 static void SetInt(UPARAM(ref) FAdditionalFields& AdditionalFields, FName Field, int32 Value, FAdditionalFields& Out);
128 UFUNCTION(BlueprintPure, Category = "Stream Chat|Additional Fields")
129 static void SetBool(UPARAM(ref) FAdditionalFields& AdditionalFields, FName Field, bool bValue, FAdditionalFields& Out);
130
131 UFUNCTION(BlueprintCallable, Category = "Stream Chat|Additional Fields", meta = (ReturnDisplayName = Success))
132 static bool GetString(const FAdditionalFields& AdditionalFields, FName Field, FString& Result);
133 UFUNCTION(BlueprintCallable, Category = "Stream Chat|Additional Fields", meta = (ReturnDisplayName = Success))
134 static bool GetFloat(const FAdditionalFields& AdditionalFields, FName Field, float& Result);
135 UFUNCTION(BlueprintCallable, Category = "Stream Chat|Additional Fields", meta = (ReturnDisplayName = Success))
136 static bool GetInt(const FAdditionalFields& AdditionalFields, FName Field, int32& Result);
137 UFUNCTION(BlueprintCallable, Category = "Stream Chat|Additional Fields", meta = (ReturnDisplayName = Success))
138 static bool GetBool(const FAdditionalFields& AdditionalFields, FName Field, bool& Result);
139};
Blueprint functions for the Additional Fields struct.
Definition: AdditionalFields.h:118
STREAMJSON_API bool JsonObjectToUStruct(const TSharedRef< FJsonObject > &JsonObject, const UStruct *StructDefinition, void *OutStruct)
Converts from a Json Object to a UStruct, using importText.
Definition: JsonObjectDeserialization.cpp:695
Conversion to and from dynamic JSON objects.
Definition: StreamJson.h:16