delphimvcframework/lib/swagdoc/Source/Swag.Doc.FileLoader.pas

202 lines
8.1 KiB
ObjectPascal

{******************************************************************************}
{ }
{ Delphi SwagDoc Library }
{ Copyright (c) 2018 Marcelo Jaloto }
{ https://github.com/marcelojaloto/SwagDoc }
{ }
{******************************************************************************}
{ }
{ Licensed under the Apache License, Version 2.0 (the "License"); }
{ you may not use this file except in compliance with the License. }
{ You may obtain a copy of the License at }
{ }
{ http://www.apache.org/licenses/LICENSE-2.0 }
{ }
{ Unless required by applicable law or agreed to in writing, software }
{ distributed under the License is distributed on an "AS IS" BASIS, }
{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. }
{ See the License for the specific language governing permissions and }
{ limitations under the License. }
{ }
{******************************************************************************}
unit Swag.Doc.FileLoader;
interface
uses
Swag.Doc;
type
TSwagFileLoader = class(TObject)
strict private
fSwagDoc: TSwagDoc;
public
constructor Create(pSwagDocTarget: TSwagDoc);
procedure Load(const pFilename: string);
end;
implementation
uses
System.SysUtils,
System.Generics.Collections,
System.JSON,
System.IOUtils,
System.Classes,
Swag.Common.Types,
Swag.Common.Types.Helpers,
Swag.Doc.Path,
Swag.Doc.Tags,
Swag.Doc.SecurityDefinition,
Swag.Doc.Definition,
Swag.Doc.Path.Operation.RequestParameter;
{ TSwagFileLoader }
constructor TSwagFileLoader.Create(pSwagDocTarget: TSwagDoc);
begin
inherited Create;
fSwagDoc := pSwagDocTarget;
end;
procedure TSwagFileLoader.Load(const pFilename: string);
var
vSwaggerJson: TJSONValue;
vJsonObj: TJSONObject;
vPath: TSwagPath;
vJsonTagsArray: TJSONArray;
vTag: TSwagTag;
vJsonSchemesArray: TJSONArray;
vJsonProduces: TJSONArray;
vJsonConsumes: TJSONArray;
vJsonDefinitions: TJSONObject;
vDefinition: TSwagDefinition;
vJsonParameters: TJSONObject;
vParameter: TSwagRequestParameter;
vJsonSecurityDefinitions: TJSONObject;
vJsonSecurityDefinitionItem: TJSONObject;
vSecurityDefinitionClass: TPersistentClass;
vSecurityDefinitionType: TSwagSecurityDefinitionType;
vSecurityDefinition: TSwagSecurityDefinition;
vJsonExternalDocs: TJSONObject;
vIndex: Integer;
begin
if not FileExists(pFilename) then
raise ESwagErrorLoadSwaggerJsonFile.Create('File doesn''t exist ['+pFilename+']');
vSwaggerJson := TJSONObject.ParseJSONValue(TFile.ReadAllText(pFilename)) as TJSONObject;
try
if not Assigned(vSwaggerJson) then
raise ESwagErrorLoadSwaggerJsonFile.Create('File could not be loaded ['+pFilename+']');
fSwagDoc.Info.Load((vSwaggerJson as TJSONObject).Values[c_SwagInfo] as TJSONObject);
vJsonTagsArray := (vSwaggerJson as TJSONObject).Values[c_SwagTags] as TJSONArray;
if Assigned(vJsonTagsArray) then
for vIndex := 0 to vJsonTagsArray.Count - 1 do
begin
vTag := TSwagTag.Create;
vTag.Load(vJsonTagsArray.Items[vIndex] as TJSONObject);
fSwagDoc.Tags.Add(vTag);
end;
vJsonObj := (vSwaggerJson as TJSONObject).Values[c_SwagPaths] as TJSONObject;
vJsonSchemesArray := (vSwaggerJson as TJSONObject).Values[c_SwagSchemes] as TJSONArray;
if Assigned(vJsonSchemesArray) then
for vIndex := 0 to vJsonSchemesArray.Count - 1 do
begin
fSwagDoc.Schemes.Add(vJsonSchemesArray.Items[vIndex].Value);
end;
if Assigned((vSwaggerJson as TJSONObject).Values[c_SwagHost]) then
fSwagDoc.Host := (vSwaggerJson as TJSONObject).Values[c_SwagHost].Value
else
fSwagDoc.Host := EmptyStr;
if Assigned((vSwaggerJson as TJSONObject).Values[c_SwagBasePath]) then
fSwagDoc.BasePath := (vSwaggerJson as TJSONObject).Values[c_SwagBasePath].Value
else
fSwagDoc.BasePath := EmptyStr;
for vIndex := 0 to vJsonObj.Count - 1 do
begin
vPath := TSwagPath.Create;
vPath.Uri := vJsonObj.Pairs[vIndex].JSONString.Value;
vPath.Load((vJsonObj.Pairs[vIndex].JsonValue) as TJSONObject);
fSwagDoc.Paths.Add(vPath);
end;
vJsonProduces := (vSwaggerJson as TJSONObject).Values[c_SwagProduces] as TJSONArray;
if Assigned(vJsonProduces) then
for vIndex := 0 to vJsonProduces.Count - 1 do
begin
fSwagDoc.Produces.Add(vJsonProduces.Items[vIndex].Value);
end;
vJsonConsumes := (vSwaggerJson as TJSONObject).Values[c_SwagConsumes] as TJSONArray;
if Assigned(vJsonConsumes) then
for vIndex := 0 to vJsonConsumes.count - 1 do
begin
fSwagDoc.Consumes.Add(vJsonConsumes.Items[vIndex].Value);
end;
vJsonDefinitions := (vSwaggerJson as TJSONObject).Values[c_SwagDefinitions] as TJSONObject;
if Assigned(vJsonDefinitions) then
for vIndex := 0 to vJsonDefinitions.Count - 1 do
begin
vDefinition := TSwagDefinition.Create;
vDefinition.Name := (vJsonDefinitions.Pairs[vIndex] as TJSONPair).JsonString.Value;
vDefinition.JsonSchema := ((vJsonDefinitions.Pairs[vIndex] as TJSONPair).JsonValue.Clone as TJSONObject);
fSwagDoc.Definitions.Add(vDefinition);
end;
vJsonParameters := (vSwaggerJson as TJSONObject).Values[c_SwagParameters] as TJSONObject;
if Assigned(vJsonParameters) then
for vIndex := 0 to vJsonParameters.Count - 1 do
begin
vParameter := TSwagRequestParameter.Create;
vParameter.Name := (vJsonParameters.Pairs[vIndex] as TJSONPair).JsonString.Value;
vParameter.Load((vJsonParameters.Pairs[vIndex] as TJSONPair).JsonValue as TJSONObject);
fSwagDoc.Parameters.Add(vParameter);
end;
{ TODO : test... }
vJsonSecurityDefinitions := (vSwaggerJson as TJSONObject).Values[c_SwagSecurityDefinitions] as TJSONObject;
if Assigned(vJsonSecurityDefinitions) then
for vIndex := 0 to vJsonSecurityDefinitions.Count - 1 do
begin
vJsonSecurityDefinitionItem := vJsonSecurityDefinitions.Pairs[vIndex].JsonValue as TJSONObject;
if not Assigned(vJsonSecurityDefinitionItem) or
not Assigned(vJsonSecurityDefinitionItem.Values[c_SwagSecurityDefinitionsType]) or
vJsonSecurityDefinitionItem.Values[c_SwagSecurityDefinitionsType].Value.Trim.IsEmpty then
Continue;
vSecurityDefinitionType.ToType(vJsonSecurityDefinitionItem.Values[c_SwagSecurityDefinitionsType].Value);
vSecurityDefinitionClass := TSwagGetClassSecurityDefinition.Find(vSecurityDefinitionType);
if Assigned(vSecurityDefinitionClass) then
begin
vSecurityDefinition := TSwagSecurityDefinition(vSecurityDefinitionClass).Create;
vSecurityDefinition.SchemeName := (vJsonSecurityDefinitions.Pairs[vIndex] as TJSONPair).JsonString.Value;
vSecurityDefinition.Load((vJsonSecurityDefinitions.Pairs[vIndex] as TJSONPair).JsonValue as TJSONObject);
fSwagDoc.SecurityDefinitions.Add(vSecurityDefinition);
end;
end;
vJsonExternalDocs := (vSwaggerJson as TJSONObject).Values[c_SwagExternalDocs] as TJSONObject;
if Assigned(vJsonExternalDocs) then
begin
if Assigned(vJsonExternalDocs.Values[c_SwagExternalDocsUrl]) then
fSwagDoc.ExternalDocs.Url := vJsonExternalDocs.Values[c_SwagExternalDocsUrl].Value;
if Assigned(vJsonExternalDocs.Values[c_SwagExternalDocsDescription]) then
fSwagDoc.ExternalDocs.Description := vJsonExternalDocs.Values[c_SwagExternalDocsDescription].Value;
end;
finally
vSwaggerJson.Free;
end;
end;
end.