Browse Source

* Not all types may need serialization

Michaël Van Canneyt 1 month ago
parent
commit
391c5b79e4
1 changed files with 45 additions and 33 deletions
  1. 45 33
      packages/fcl-jsonschema/src/fpjson.schema.codegen.pp

+ 45 - 33
packages/fcl-jsonschema/src/fpjson.schema.codegen.pp

@@ -83,19 +83,21 @@ Type
   private
     FConvertUTC: Boolean;
     FDataUnitName: string;
-    function FieldToJSON(aProperty: TPascalPropertyData) : string;
-    function ArrayMemberToField(aType: TPropertyType; const aPropertyTypeName: String; const aFieldName: string): string;
-    function FieldToJSON(aType: TPropertyType; aFieldName: String): string;
-    procedure GenerateConverters;
-    function JSONToField(aProperty: TPascalPropertyData) : string;
-    function JSONToField(aType: TPropertyType; const aPropertyTypeName: string; const aKeyName: string): string;
-    procedure WriteFieldDeSerializer(aType : TPascalTypeData; aProperty: TPascalPropertyData);
-    procedure WriteFieldSerializer(aType : TPascalTypeData; aProperty: TPascalPropertyData);
-    procedure WriteDtoObjectSerializer(aType: TPascalTypeData);
-    procedure WriteDtoSerializer(aType: TPascalTypeData);
-    procedure WriteDtoObjectDeserializer(aType: TPascalTypeData);
-    procedure WriteDtoDeserializer(aType: TPascalTypeData);
-    procedure WriteDtoHelper(aType: TPascalTypeData);
+  protected
+    function MustSerializeType(aType : TPascalTypeData) : boolean; virtual;
+    function FieldToJSON(aProperty: TPascalPropertyData) : string; virtual;
+    function ArrayMemberToField(aType: TPropertyType; const aPropertyTypeName: String; const aFieldName: string): string; virtual;
+    function FieldToJSON(aType: TPropertyType; aFieldName: String): string; virtual;
+    procedure GenerateConverters; virtual;
+    function JSONToField(aProperty: TPascalPropertyData) : string; virtual;
+    function JSONToField(aType: TPropertyType; const aPropertyTypeName: string; const aKeyName: string): string; virtual;
+    procedure WriteFieldDeSerializer(aType : TPascalTypeData; aProperty: TPascalPropertyData); virtual;
+    procedure WriteFieldSerializer(aType : TPascalTypeData; aProperty: TPascalPropertyData); virtual;
+    procedure WriteDtoObjectSerializer(aType: TPascalTypeData); virtual;
+    procedure WriteDtoSerializer(aType: TPascalTypeData); virtual;
+    procedure WriteDtoObjectDeserializer(aType: TPascalTypeData); virtual;
+    procedure WriteDtoDeserializer(aType: TPascalTypeData); virtual;
+    procedure WriteDtoHelper(aType: TPascalTypeData); virtual;
   public
     procedure Execute(aData: TSchemaData);
     property DataUnitName: string read FDataUnitName write FDataUnitName;
@@ -436,6 +438,11 @@ end;
 
 { TSerializerCodeGenerator }
 
+function TSerializerCodeGenerator.MustSerializeType(aType: TPascalTypeData): boolean;
+begin
+  Result:=Assigned(aType);
+end;
+
 function TSerializerCodeGenerator.FieldToJSON(aProperty: TPascalPropertyData): string;
 
 begin
@@ -943,13 +950,15 @@ begin
     indent;
     for I := 0 to aData.TypeCount-1 do
     begin
-      with aData.Types[I] do
-        if Pascaltype in [ptSchemaStruct,ptAnonStruct] then
-          begin
-          DoLog('Generating serialization helper type %s for Dto %s', [SerializerName, PascalName]);
-          WriteDtoHelper(aData.Types[I]);
-          Addln('');
-          end;
+      lType := aData.Types[I];
+      if MustSerializeType(lType) then
+        with lType do
+          if Pascaltype in [ptSchemaStruct,ptAnonStruct] then
+            begin
+            DoLog('Generating serialization helper type %s for Dto %s', [SerializerName, PascalName]);
+            WriteDtoHelper(lType);
+            Addln('');
+            end;
     end;
     undent;
     Addln('implementation');
@@ -963,19 +972,22 @@ begin
     for I := 0 to aData.TypeCount-1 do
     begin
       lType := aData.Types[I];
-      if LType.Pascaltype in [ptSchemaStruct,ptAnonStruct] then
-        begin
-        if stSerialize in lType.SerializeTypes then
-        begin
-          WriteDtoObjectSerializer(aData.Types[I]);
-          WriteDtoSerializer(aData.Types[I]);
-        end;
-        if stDeserialize in lType.SerializeTypes then
-        begin
-          WriteDtoObjectDeserializer(aData.Types[I]);
-          WriteDtoDeserializer(aData.Types[I]);
-        end;
-        end;
+      if MustSerializeType(lType) then
+      begin
+        if LType.Pascaltype in [ptSchemaStruct,ptAnonStruct] then
+          begin
+          if stSerialize in lType.SerializeTypes then
+          begin
+            WriteDtoObjectSerializer(aData.Types[I]);
+            WriteDtoSerializer(aData.Types[I]);
+          end;
+          if stDeserialize in lType.SerializeTypes then
+          begin
+            WriteDtoObjectDeserializer(aData.Types[I]);
+            WriteDtoDeserializer(aData.Types[I]);
+          end;
+          end;
+      end;
     end;
     Addln('');
     Addln('end.');