forked from gabr42/OmniThreadLibrary
-
Notifications
You must be signed in to change notification settings - Fork 0
/
OtlSuperObject.pas
129 lines (115 loc) · 4.38 KB
/
OtlSuperObject.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
///<summary>TOmniValue to SuperObject [superobject.googlecode.com] converters.
/// Part of the OmniThreadLibrary project. Requires Delphi 2009 or newer.</summary>
///<author>Primoz Gabrijelcic</author>
///<license>
///This software is distributed under the BSD license.
///
///Copyright (c) 2019 Primoz Gabrijelcic
///All rights reserved.
///
///Redistribution and use in source and binary forms, with or without modification,
///are permitted provided that the following conditions are met:
///- Redistributions of source code must retain the above copyright notice, this
/// list of conditions and the following disclaimer.
///- Redistributions in binary form must reproduce the above copyright notice,
/// this list of conditions and the following disclaimer in the documentation
/// and/or other materials provided with the distribution.
///- The name of the Primoz Gabrijelcic may not be used to endorse or promote
/// products derived from this software without specific prior written permission.
///
///THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
///ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
///WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
///DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
///ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
///(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
///LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
///ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
///(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
///SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
///</license>
///<remarks><para>
/// Home : http://www.omnithreadlibrary.com
/// Support : https://en.delphipraxis.net/forum/32-omnithreadlibrary/
/// Author : Lee_Nover
/// Creation date : 2013-06-05
/// Last modification : 2013-06-05
/// Version : 1.0
///</para><para>
/// History:
/// 1.0: 2013-06-05
/// - Created.
unit OtlSuperObject;
interface
uses
RTTI,
SuperObject;
type
TOtlSuperRttiContext = class(TSuperRttiContext)
public
constructor Create; override;
end;
function OmniValToSO(ctx: TSuperRttiContext; var value: TValue; const index: ISuperObject): ISuperObject;
function SOToOmniVal(ctx: TSuperRttiContext; const obj: ISuperObject; var Value: TValue): Boolean;
implementation
uses
SysUtils,
OtlCommon;
function OmniValToSO(ctx: TSuperRttiContext; var value: TValue; const index: ISuperObject): ISuperObject;
var
ov: TOmniValue;
v: TValue;
begin
ov := value.AsType<TOmniValue>();
// todo: add support for copying arrays
v := ov;
Result := ctx.ToJson(v, index);
end;
function SOToOmniVal(ctx: TSuperRttiContext; const obj: ISuperObject; var Value: TValue): Boolean;
var
ov: TOmniValue;
stArr: TSuperArray;
// vArr: TArray<TValue>;
// arrItem: ISuperObject;
idxItem: Integer;
ovc: TOmniValueContainer;
begin
Result := True;
ov := nil;
case obj.DataType of
stNull: ov := nil;
stBoolean: ov := obj.AsBoolean;
stDouble: ov := obj.AsDouble;
stCurrency: ov := obj.AsCurrency;
stInt: ov := obj.AsInteger;
stObject: ov := TObject(obj.DataPtr);
stArray:
begin
stArr := obj.AsArray;
ov := TOmniValue.Create([]);
ovc := ov.AsArray;
for idxItem := 0 to stArr.Length-1 do
case stArr[idxItem].DataType of
stNull: ovc.Add(nil);
stBoolean: ovc.Add(stArr.B[idxItem]);
stDouble: ovc.Add(stArr.D[idxItem]);
stCurrency: ovc.Add(stArr.C[idxItem]);
stInt: ovc.Add(stArr.I[idxItem]);
stObject: ovc.Add(stArr.O[idxItem]);
// stArray: vArr[idxItem] := stArr;
stString: ovc.Add(stArr.S[idxItem]);
end;
end;
stString: ov := obj.AsString;
stMethod: Result := False;
end;
Value := TValue.From<TOmniValue>(ov);
end;
{ TOtlSuperRttiContext }
constructor TOtlSuperRttiContext.Create;
begin
inherited;
SerialToJson.AddOrSetValue(TypeInfo(TOmniValue), OmniValToSO);
SerialFromJson.AddOrSetValue(TypeInfo(TOmniValue), SOToOmniVal);
end;
end.