fpopenapi.reader.pp 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166
  1. {
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 2024 by Michael Van Canneyt ([email protected])
  4. Classes for reading a OpenAPI document.
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit fpopenapi.reader;
  12. {$mode ObjFPC}{$H+}
  13. interface
  14. uses
  15. {$IFDEF FPC_DOTTEDUNITS}
  16. System.SysUtils, System.Classes, System.Contnrs, FpJson.Data, FpJson.Scanner,
  17. {$ELSE}
  18. sysutils, classes, contnrs, fpjson, jsonscanner,
  19. {$ENDIF}
  20. fpopenapi.types, fpopenapi.objects, fpjson.schema.schema;
  21. Type
  22. EOpenAPIReader = Class(EOpenAPi);
  23. TJSONTokens = set of TJSONToken;
  24. { TOpenAPIReader }
  25. TCreateAndReadObjectFunc = Function(aParent : TBaseOpenAPIObject;aName : TJSONStringType) : TBaseOpenAPIObject of object;
  26. TReadObjectProc = Procedure(aObject : TBaseOpenAPIObject; aCheckBracket: Boolean=True) of object;
  27. TOpenAPIReader = Class(TComponent)
  28. Private
  29. FScanner : TJSONScanner;
  30. procedure InvalidToken(aToken: TJSONToken);
  31. function StringToJSONNumber(S: RawByteString): TJSONNumber;
  32. procedure ReadJSONArray(aArray: TJSONArray);
  33. function ReadParameterOrReferenceObject(aParent: TBaseOpenAPIObject; aName : TJSONStringType): TBaseOpenAPIObject;
  34. function ReadSecurityRequirementObject(aParent: TBaseOpenAPIObject; aName : TJSONStringType): TBaseOpenAPIObject;
  35. function ReadServerObject(aParent: TBaseOpenAPIObject; aName : TJSONStringType): TBaseOpenAPIObject;
  36. function ReadTagObject(aParent: TBaseOpenAPIObject; aName : TJSONStringType): TBaseOpenAPIObject;
  37. // Untyped callbacks
  38. procedure ReadServerVariableUntyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  39. procedure ReadPathItemOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  40. procedure ReadParameterOrReferenceUntyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  41. procedure ReadRequestBodyOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  42. procedure ReadMediaTypeUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  43. procedure ReadEncodingUntyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  44. procedure ReadResponseOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  45. procedure ReadExampleOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  46. procedure ReadLinkOrReferenceUntyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  47. procedure ReadHeaderOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  48. procedure ReadSecuritySchemeOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  49. procedure ReadCallbackOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  50. Protected
  51. function CurPosAsString: String;
  52. function TokensToString(aTokens: TJSONTokens): String;
  53. Function GetToken : TJSONToken;
  54. Procedure CheckToken(aExpected,aActual : TJSONToken);
  55. Procedure CheckToken(aExpected : TJSONTokens; aActual : TJSONToken);
  56. procedure CheckNextToken(aExpected : TJSONToken);
  57. function CheckNextToken(aExpected : TJSONTokens) : TJSONToken;
  58. Function GetTokenString : TJSONStringType;
  59. Function ReadString : TJSONStringType;
  60. Function ReadBoolean : Boolean;
  61. Function ReadJSONData : TJSONData;
  62. function ReadJSONData(aToken: TJSONToken): TJSONData;
  63. procedure ReadJSONObject(aObject: TJSONObject; aCheckOpening: Boolean=True);
  64. procedure HandleParamOrHeader(aObj: TParameterOrHeader; aName : String);
  65. procedure DoReadObject(aObj: TParameterOrHeader; aCheckBracket: Boolean);
  66. Function ReadObjectArray(aList : TFPObjectList; aGetObject : TCreateAndReadObjectFunc) : integer;overload;
  67. function ReadMapObject(aList: TNamedOpenAPIObjectList; aObjectReader : TReadObjectProc; aCheckBracket: Boolean=True): integer;
  68. Function ReadObject(aList : TStrings) : integer;
  69. // objects
  70. Procedure ReadOpenAPI(aObj : TOpenAPI; aCheckBracket : Boolean = True); virtual; overload;
  71. Procedure ReadInfo(aObj : TInfo; aCheckBracket : Boolean = True); virtual; overload;
  72. Procedure ReadContact(aObj : TContact; aCheckBracket : Boolean = True); virtual; overload;
  73. Procedure ReadLicense(aObj : TLicense; aCheckBracket : Boolean = True); virtual; overload;
  74. Procedure ReadServer(aObj : TServer; aCheckBracket : Boolean = True); virtual; overload;
  75. Procedure ReadServerList(aObj : TServerList); virtual; overload;
  76. Procedure ReadPathsList(aObj : TPathsList; aCheckBracket : Boolean = True); virtual; overload;
  77. Procedure ReadServerVariable(aObj : TServerVariable; aCheckBracket : Boolean = True); virtual; overload;
  78. Procedure ReadServerVariableMap(aObj : TServerVariableMap; aCheckBracket : Boolean = True); virtual; overload;
  79. Procedure ReadJSONSchemaMap(aObj : TJSONSchemaMap; aCheckBracket : Boolean = True); virtual; overload;
  80. Procedure ReadJSONSchema(aObj : TJSONSchema; aCheckBracket : Boolean = True); virtual; overload;
  81. Procedure ReadComponents(aObj : TComponents; aCheckBracket : Boolean = True); virtual; overload;
  82. Procedure ReadPathItem(aObj : TPathItem; aCheckBracket : Boolean = True); virtual; overload;
  83. Procedure ReadPathItemOrReference(aObj : TPathItemOrReference; aCheckBracket : Boolean = True); virtual; overload;
  84. Procedure ReadPathItemOrReferenceMap(aObj : TPathItemOrReferenceMap; aCheckBracket : Boolean = True); virtual; overload;
  85. Procedure ReadApiOperation(aObj : TApiOperation; aCheckBracket : Boolean = True); virtual; overload;
  86. Procedure ReadExternalDocumentation(aObj : TExternalDocumentation; aCheckBracket : Boolean = True); virtual; overload;
  87. Procedure ReadParameter(aObj : TParameter; aCheckBracket : Boolean = True); virtual; overload;
  88. Procedure ReadParameterOrReference(aObj : TParameterOrReference; aCheckBracket : Boolean = True); virtual; overload;
  89. Procedure ReadParameterOrReferenceList(aObj : TParameterOrReferenceList); virtual; overload;
  90. Procedure ReadParameterOrReferenceMap(aObj : TParameterOrReferenceMap; aCheckBracket : Boolean = True); virtual; overload;
  91. Procedure ReadParameterStyle(aObj : TParameterStyle; aCheckBracket : Boolean = True); virtual; overload;
  92. Procedure ReadRequestBody(aObj : TRequestBody; aCheckBracket : Boolean = True); virtual; overload;
  93. Procedure ReadRequestBodyOrReference(aObj : TRequestBodyOrReference; aCheckBracket : Boolean = True); virtual; overload;
  94. Procedure ReadRequestBodyOrReferenceMap(aObj : TRequestBodyOrReferenceMap; aCheckBracket : Boolean = True); virtual; overload;
  95. Procedure ReadMediaType(aObj : TMediaType; aCheckBracket : Boolean = True); virtual; overload;
  96. Procedure ReadMediaTypeMap(aObj : TMediaTypeMap; aCheckBracket : Boolean = True); virtual; overload;
  97. Procedure ReadEncoding(aObj : TEncoding; aCheckBracket : Boolean = True); virtual; overload;
  98. Procedure ReadEncodingMap(aObj : TEncodingMap; aCheckBracket : Boolean = True); virtual; overload;
  99. Procedure ReadResponses(aObj : TResponses; aCheckBracket : Boolean = True); virtual; overload;
  100. Procedure ReadResponse(aObj : TResponse; aCheckBracket : Boolean = True); virtual; overload;
  101. Procedure ReadResponseOrReference(aObj : TResponseOrReference; aCheckBracket : Boolean = True); virtual; overload;
  102. Procedure ReadResponseOrReferenceMap(aObj : TResponseOrReferenceMap; aCheckBracket : Boolean = True); virtual; overload;
  103. Procedure ReadExample(aObj : TExample; aCheckBracket : Boolean = True); virtual; overload;
  104. Procedure ReadExampleOrReference(aObj : TExampleOrReference; aCheckBracket : Boolean = True); virtual; overload;
  105. Procedure ReadExampleOrReferenceMap(aObj : TExampleOrReferenceMap; aCheckBracket : Boolean = True); virtual; overload;
  106. Procedure ReadLink(aObj : TLink; aCheckBracket : Boolean = True); virtual; overload;
  107. Procedure ReadLinkOrReference(aObj : TLinkOrReference; aCheckBracket : Boolean = True); virtual; overload;
  108. Procedure ReadLinkOrReferenceMap(aObj : TLinkOrReferenceMap; aCheckBracket : Boolean = True); virtual; overload;
  109. Procedure ReadTag(aObj : TTag; aCheckBracket : Boolean = True); virtual; overload;
  110. Procedure ReadReference(aObj : TReference; aCheckBracket : Boolean = True); virtual; overload;
  111. Procedure ReadSchema(aObj : TSchema; aCheckBracket : Boolean = True); virtual; overload;
  112. Procedure ReadDiscriminator(aObj : TDiscriminator; aCheckBracket : Boolean = True); virtual; overload;
  113. Procedure ReadXML(aObj : TXML; aCheckBracket : Boolean = True); virtual; overload;
  114. Procedure ReadSecurityScheme(aObj : TSecurityScheme; aCheckBracket : Boolean = True); virtual; overload;
  115. Procedure ReadSecuritySchemeOrReference(aObj : TSecuritySchemeOrReference; aCheckBracket : Boolean = True); virtual; overload;
  116. Procedure ReadSecuritySchemeOrReferenceMap(aObj : TSecuritySchemeOrReferenceMap; aCheckBracket : Boolean = True); virtual; overload;
  117. Procedure ReadOAuthFlows(aObj : TOAuthFlows; aCheckBracket : Boolean = True); virtual; overload;
  118. Procedure ReadOAuthFlow(aObj : TOauthFlow; aCheckBracket : Boolean = True); virtual; overload;
  119. Procedure ReadHeader(aObj : THeader; aCheckBracket : Boolean = True); virtual; overload;
  120. Procedure ReadHeaderOrReference(aObj : THeaderOrReference; aCheckBracket : Boolean = True); virtual; overload;
  121. Procedure ReadHeaderOrReferenceMap(aObj : THeaderOrReferenceMap; aCheckBracket : Boolean = True); virtual; overload;
  122. Procedure ReadCallbackOrReference(aObj : TCallbackOrReference; aCheckBracket : Boolean = True); virtual; overload;
  123. Procedure ReadCallbackOrReferenceMap(aObj : TCallbackOrReferenceMap; aCheckBracket : Boolean = True); virtual; overload;
  124. Procedure ReadSecurityRequirement(aObj : TSecurityRequirement; aCheckBracket : Boolean = True); virtual; overload;
  125. Procedure ReadSecurityRequirementList(aObj : TSecurityRequirementList); virtual; overload;
  126. Procedure ReadTagList(aObj : TTagList); virtual; overload;
  127. Public
  128. procedure ReadFromScanner(aOpenAPI: TOpenAPI; AScanner: TJSONScanner);
  129. procedure ReadFromFile(aOpenAPI: TOpenAPI; const AFilename: String);
  130. procedure ReadFromStream(aOpenAPI: TOpenAPI; AStream: TStream);
  131. procedure ReadFromString(aOpenAPI: TOpenAPI; const AString: TJSONStringType);
  132. end;
  133. implementation
  134. uses fpjson.schema.reader, fpjson.schema.consts;
  135. function TOpenAPIReader.GetToken: TJSONToken;
  136. const
  137. IgnoredTokens = [tkWhitespace,tkComment];
  138. begin
  139. repeat
  140. Result:=FScanner.FetchToken;
  141. until Not (Result in IgnoredTokens);
  142. end;
  143. function TOpenAPIReader.CurPosAsString: String;
  144. begin
  145. Result:=Format('%d:%d',[FScanner.CurRow,FScanner.CurColumn]);
  146. end;
  147. procedure TOpenAPIReader.InvalidToken(aToken: TJSONToken);
  148. begin
  149. raise EOpenAPIReader.CreateFmt(SErrInvalidToken, [CurPosAsString, TokenInfos[aToken]]);
  150. end;
  151. procedure TOpenAPIReader.CheckToken(aExpected, aActual: TJSONToken);
  152. begin
  153. if aExpected<>aActual then
  154. raise EOpenAPIReader.CreateFmt(SErrUnexpectedToken, [CurPosAsString, TokenInfos[aExpected], TokenInfos[aActual]]);
  155. end;
  156. procedure TOpenAPIReader.CheckToken(aExpected: TJSONTokens; aActual: TJSONToken);
  157. begin
  158. if not (aActual in aExpected) then
  159. raise EOpenAPIReader.CreateFmt(SErrUnexpectedTokenNotInSet, [TokensToString(aExpected), TokenInfos[aActual]]);
  160. end;
  161. function TOpenAPIReader.TokensToString(aTokens : TJSONTokens) : String;
  162. var
  163. T : TJSONToken;
  164. S : String;
  165. begin
  166. S:='';
  167. For T in aTokens do
  168. begin
  169. if (S<>'') then
  170. S:=S+', ';
  171. S:=S+'"'+TokenInfos[T]+'"';
  172. end;
  173. Result:=S;
  174. end;
  175. procedure TOpenAPIReader.CheckNextToken(aExpected: TJSONToken);
  176. begin
  177. CheckToken(aExpected,GetToken);
  178. end;
  179. function TOpenAPIReader.CheckNextToken(aExpected: TJSONTokens): TJSONToken;
  180. begin
  181. Result:=GetToken;
  182. CheckToken(aExpected,Result);
  183. end;
  184. function TOpenAPIReader.GetTokenString: TJSONStringType;
  185. begin
  186. Result:=FScanner.CurTokenString;
  187. end;
  188. function TOpenAPIReader.ReadString: TJSONStringType;
  189. var
  190. aToken: TJSONToken;
  191. begin
  192. aToken:=GetToken;
  193. CheckToken(tkString,aToken);
  194. Result:=GetTokenString;
  195. end;
  196. function TOpenAPIReader.ReadBoolean: Boolean;
  197. var
  198. aToken : TJSONToken;
  199. begin
  200. aToken:=GetToken;
  201. CheckToken([tkTrue,tkFalse],aToken);
  202. Result:=aToken=tkTrue;
  203. end;
  204. function TOpenAPIReader.ReadJSONData: TJSONData;
  205. begin
  206. Result:=ReadJSONData(GetToken);
  207. end;
  208. function TOpenAPIReader.StringToJSONNumber(S : RawByteString): TJSONNumber;
  209. var
  210. I : integer;
  211. I64 : Int64;
  212. Q : QWord;
  213. F : TJSONFloat;
  214. begin
  215. if TryStrToInt(S,I) then
  216. Exit(TJSONIntegerNumber.Create(I));
  217. if TryStrToInt64(S,I64) then
  218. Exit(TJSONInt64Number.Create(I64));
  219. if TryStrToQWord(S,Q) then
  220. Exit(TJSONQWordNumber.Create(Q));
  221. Val(S,F,I);
  222. If (I<>0) then
  223. EConvertError.CreateFmt(SErrInvalidNumber,[S]);
  224. Result:=TJSONFloatNumber.Create(F);
  225. end;
  226. function TOpenAPIReader.ReadJSONData(aToken : TJSONToken): TJSONData;
  227. begin
  228. Result:=nil;
  229. try
  230. case aToken of
  231. tkNull : Result:=TJSONNull.Create;
  232. tkNumber : Result:=StringToJSONNumber(GetTokenString);
  233. tkTrue,
  234. tkFalse : Result:=TJSONBoolean.Create(aToken=tkTrue);
  235. tkString : Result:=TJSONString.Create(GetTokenString);
  236. tkCurlyBraceOpen :
  237. begin
  238. Result:=TJSONObject.Create;
  239. ReadJSONObject(TJSONObject(Result),False);
  240. end;
  241. tkSquaredBraceOpen :
  242. begin
  243. Result:=TJSONArray.Create;
  244. ReadJSONArray(TJSONArray(Result));
  245. end
  246. else
  247. InvalidToken(aToken);
  248. end;
  249. except
  250. Result.Free;
  251. Raise;
  252. end;
  253. end;
  254. procedure TOpenAPIReader.ReadJSONArray(aArray: TJSONArray);
  255. // On entry, we're on [
  256. var
  257. aToken : TJSONToken;
  258. begin
  259. Repeat
  260. aToken:=GetToken;
  261. if Not (aToken in [tkComma,tkSquaredBraceClose]) then
  262. aArray.Add(ReadJSONData(aToken));
  263. until (aToken in [tkSquaredBraceClose,tkEOF]);
  264. CheckToken(tkSquaredBraceClose,aToken);
  265. end;
  266. procedure TOpenAPIReader.ReadJSONObject(aObject : TJSONObject; aCheckOpening: Boolean = True);
  267. var
  268. aToken : TJSONToken;
  269. aName : TJSONStringtype;
  270. begin
  271. if aCheckOpening then
  272. CheckNextToken(tkCurlyBraceOpen);
  273. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  274. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  275. begin
  276. aName:=GetTokenString;
  277. CheckNextToken(tkColon);
  278. aObject.Add(aNAme,ReadJSONData);
  279. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  280. if aToken=tkComma then
  281. aToken:=CheckNextToken([tkString,tkIdentifier]);
  282. end;
  283. CheckToken(tkCurlyBraceClose,aToken);
  284. end;
  285. procedure TOpenAPIReader.HandleParamOrHeader(aObj: TParameterOrHeader; aName: String);
  286. var
  287. aKeyWord : TParameterKeyword;
  288. begin
  289. aKeyword:=TParameterKeyword.FromString(aName);
  290. case aKeyword of
  291. pakName:
  292. if aObj is TParameter then
  293. TParameter(aObj).Name:=Readstring
  294. else
  295. aObj.Extensions.Add(aName,ReadJSONData);
  296. pakIn:
  297. if aObj is TParameter then
  298. TParameter(aObj).In_:=Readstring
  299. else
  300. aObj.Extensions.Add(aName,ReadJSONData);
  301. pakDescription:
  302. aObj.Description:=Readstring;
  303. pakRequired:
  304. aObj.Required:=ReadBoolean;
  305. pakDeprecated:
  306. aObj.Deprecated:=ReadBoolean;
  307. pakAllowEmptyValue:
  308. aObj.AllowEmptyValue:=ReadBoolean;
  309. pakStyle:
  310. aObj.Style:=Readstring;
  311. pakExplode:
  312. aObj.Explode:=ReadBoolean;
  313. pakAllowReserved:
  314. aObj.AllowReserved:=ReadBoolean;
  315. pakSchema:
  316. ReadJSONschema(aObj.Schema);
  317. pakExample:
  318. aObj.Example:=ReadJSONData;
  319. pakExamples:
  320. ReadExampleOrReferenceMap(aObj.Examples);
  321. pakContent:
  322. ReadMediaTypeMap(aObj.Content);
  323. else
  324. aObj.Extensions.Add(aName,ReadJSONData);
  325. end;
  326. end;
  327. function TOpenAPIReader.ReadMapObject(aList: TNamedOpenAPIObjectList; aObjectReader: TReadObjectProc; aCheckBracket: Boolean
  328. ): integer;
  329. // On entry, we are on { token if aCheckBracket is false, before if it is true
  330. var
  331. atoken : TJSONToken;
  332. aName : String;
  333. Itm : TObject;
  334. begin
  335. Result:=0;
  336. if aCheckBracket then
  337. checkNextToken(tkCurlyBraceOpen);
  338. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  339. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  340. begin
  341. aName:=GetTokenString;
  342. CheckNextToken(tkColon);
  343. itm:=aList.CreateNew(aName);
  344. // aList.Add(aName,Itm);
  345. if not (Itm is TBaseOpenAPIObject) then
  346. Raise EOpenAPIReader.CreateFmt('List %s created an item that is not a TOPenAPIObject',[aList.ClassName]);
  347. aObjectReader(TBaseOpenAPIObject(Itm),True);
  348. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  349. if aToken=tkComma then
  350. aToken:=CheckNextToken([tkString,tkIdentifier]);
  351. end;
  352. CheckToken(tkCurlyBraceClose,aToken);
  353. end;
  354. function TOpenAPIReader.ReadObject(aList: TStrings): integer;
  355. var
  356. aToken: TJSONToken;
  357. begin
  358. Result:=0;
  359. CheckNextToken(tkSquaredBraceOpen);
  360. aToken:=GetToken;
  361. while Not (aToken in [tkEOF,tkSquaredBraceClose]) do
  362. begin
  363. case aToken of
  364. tkComma:
  365. ;
  366. tkString:
  367. begin
  368. aList.Add(GetTokenString);
  369. inc(Result);
  370. end
  371. else
  372. InvalidToken(aToken);
  373. end;
  374. aToken:=GetToken;
  375. end;
  376. end;
  377. procedure TOpenAPIReader.ReadOpenAPI(aObj: TOpenAPI; aCheckBracket: Boolean);
  378. // On entry, we are on { token if aCheckBracket is false, before if it is true
  379. var
  380. atoken : TJSONToken;
  381. aName : String;
  382. aKeyword : TOpenAPIKeyword;
  383. begin
  384. if aCheckBracket then
  385. checkNextToken(tkCurlyBraceOpen);
  386. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  387. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  388. begin
  389. aName:=GetTokenString;
  390. CheckNextToken(tkColon);
  391. aKeyword:=TOpenAPIKeyword.FromString(aName);
  392. case aKeyword of
  393. oakOpenApi:
  394. aObj.OpenApi:=Readstring;
  395. oakInfo:
  396. ReadInfo(aObj.Info);
  397. oakJSONSchemaDialect:
  398. aObj.JSONSchemaDialect:=Readstring;
  399. oakServers:
  400. ReadServerList(aObj.Servers);
  401. oakPaths:
  402. ReadPathsList(aObj.Paths);
  403. oakWebHooks:
  404. ReadPathItemOrReferenceMap(aObj.WebHooks);
  405. oakComponents:
  406. ReadComponents(aObj.Components);
  407. oakSecurity:
  408. ReadSecurityRequirementList(aObj.Security);
  409. oakTags:
  410. ReadTagList(aObj.Tags);
  411. oakExternalDocs:
  412. ReadExternalDocumentation(aObj.ExternalDocs);
  413. else
  414. aObj.Extensions.Add(aName,ReadJSONData);
  415. end;
  416. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  417. if aToken=tkComma then
  418. aToken:=CheckNextToken([tkString,tkIdentifier]);
  419. end;
  420. CheckToken(tkCurlyBraceClose,aToken);
  421. end;
  422. procedure TOpenAPIReader.ReadInfo(aObj: TInfo; aCheckBracket: Boolean);
  423. // On entry, we are on { token if aCheckBracket is false, before if it is true
  424. var
  425. atoken : TJSONToken;
  426. aName : String;
  427. aKeyword : TInfoKeyword;
  428. begin
  429. if aCheckBracket then
  430. checkNextToken(tkCurlyBraceOpen);
  431. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  432. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  433. begin
  434. aName:=GetTokenString;
  435. CheckNextToken(tkColon);
  436. aKeyword:=TInfoKeyword.FromString(aName);
  437. case aKeyword of
  438. ikTitle:
  439. aObj.Title:=Readstring;
  440. ikSummary:
  441. aObj.Summary:=Readstring;
  442. ikDescription:
  443. aObj.Description:=Readstring;
  444. ikTermsOfService:
  445. aObj.TermsOfService:=Readstring;
  446. ikContact:
  447. ReadContact(aObj.Contact);
  448. ikLicense:
  449. ReadLicense(aObj.License);
  450. ikVersion:
  451. aObj.Version:=Readstring;
  452. else
  453. aObj.Extensions.Add(aName,ReadJSONData);
  454. end;
  455. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  456. if aToken=tkComma then
  457. aToken:=CheckNextToken([tkString,tkIdentifier]);
  458. end;
  459. CheckToken(tkCurlyBraceClose,aToken);
  460. end;
  461. procedure TOpenAPIReader.ReadContact(aObj: TContact; aCheckBracket: Boolean);
  462. // On entry, we are on { token if aCheckBracket is false, before if it is true
  463. var
  464. atoken : TJSONToken;
  465. aName : String;
  466. aKeyword : TContactKeyword;
  467. begin
  468. if aCheckBracket then
  469. checkNextToken(tkCurlyBraceOpen);
  470. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  471. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  472. begin
  473. aName:=GetTokenString;
  474. CheckNextToken(tkColon);
  475. aKeyword:=TContactKeyword.FromString(aName);
  476. case aKeyword of
  477. cokName:
  478. aObj.Name:=Readstring;
  479. cokUrl:
  480. aObj.Url:=Readstring;
  481. cokEmail:
  482. aObj.Email:=Readstring;
  483. else
  484. aObj.Extensions.Add(aName,ReadJSONData);
  485. end;
  486. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  487. if aToken=tkComma then
  488. aToken:=CheckNextToken([tkString,tkIdentifier]);
  489. end;
  490. CheckToken(tkCurlyBraceClose,aToken);
  491. end;
  492. procedure TOpenAPIReader.ReadLicense(aObj: TLicense; aCheckBracket: Boolean);
  493. // On entry, we are on { token if aCheckBracket is false, before if it is true
  494. var
  495. atoken : TJSONToken;
  496. aName : String;
  497. aKeyword : TLicenseKeyword;
  498. begin
  499. if aCheckBracket then
  500. checkNextToken(tkCurlyBraceOpen);
  501. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  502. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  503. begin
  504. aName:=GetTokenString;
  505. CheckNextToken(tkColon);
  506. aKeyword:=TLicenseKeyword.FromString(aName);
  507. case aKeyword of
  508. lkName:
  509. aObj.Name:=Readstring;
  510. lkIdentifier:
  511. aObj.Identifier:=Readstring;
  512. lkUrl:
  513. aObj.Url:=Readstring;
  514. else
  515. aObj.Extensions.Add(aName,ReadJSONData);
  516. end;
  517. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  518. if aToken=tkComma then
  519. aToken:=CheckNextToken([tkString,tkIdentifier]);
  520. end;
  521. CheckToken(tkCurlyBraceClose,aToken);
  522. end;
  523. procedure TOpenAPIReader.ReadServer(aObj: TServer; aCheckBracket: Boolean);
  524. // On entry, we are on { token if aCheckBracket is false, before if it is true
  525. var
  526. atoken : TJSONToken;
  527. aName : String;
  528. aKeyword : TServerKeyword;
  529. begin
  530. if aCheckBracket then
  531. checkNextToken(tkCurlyBraceOpen);
  532. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  533. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  534. begin
  535. aName:=GetTokenString;
  536. CheckNextToken(tkColon);
  537. aKeyword:=TServerKeyword.FromString(aName);
  538. case aKeyword of
  539. skServerUrl:
  540. aObj.Url:=Readstring;
  541. skDescription:
  542. aObj.Description:=Readstring;
  543. skVariables:
  544. ReadServerVariableMap(aObj.Variables);
  545. else
  546. aObj.Extensions.Add(aName,ReadJSONData);
  547. end;
  548. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  549. if aToken=tkComma then
  550. aToken:=CheckNextToken([tkString,tkIdentifier]);
  551. end;
  552. CheckToken(tkCurlyBraceClose,aToken);
  553. end;
  554. function TOpenAPIReader.ReadServerObject(aParent: TBaseOpenAPIObject; aName: TJSONStringType): TBaseOpenAPIObject;
  555. begin
  556. Result:=TServer.Create(aParent,'server');
  557. try
  558. ReadServer(TServer(Result),False);
  559. except
  560. Result.Free;
  561. Raise;
  562. end;
  563. end;
  564. procedure TOpenAPIReader.ReadServerList(aObj: TServerList);
  565. begin
  566. ReadObjectArray(aObj,@ReadServerObject);
  567. end;
  568. procedure TOpenAPIReader.ReadPathsList(aObj: TPathsList; aCheckBracket: Boolean);
  569. // On entry, we are on { token if aCheckBracket is false, before if it is true
  570. var
  571. atoken : TJSONToken;
  572. aName : String;
  573. Itm: TPathItem;
  574. begin
  575. if aCheckBracket then
  576. checkNextToken(tkCurlyBraceOpen);
  577. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  578. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  579. begin
  580. aName:=GetTokenString;
  581. CheckNextToken(tkColon);
  582. Itm:=aObj.AddItem(aName);
  583. ReadPathItem(Itm);
  584. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  585. if aToken=tkComma then
  586. aToken:=CheckNextToken([tkString,tkIdentifier]);
  587. end;
  588. CheckToken(tkCurlyBraceClose,aToken);
  589. end;
  590. procedure TOpenAPIReader.ReadServerVariable(aObj: TServerVariable; aCheckBracket: Boolean);
  591. // On entry, we are on { token if aCheckBracket is false, before if it is true
  592. var
  593. atoken : TJSONToken;
  594. aName : String;
  595. aKeyword : TServerVariableKeyword;
  596. begin
  597. if aCheckBracket then
  598. checkNextToken(tkCurlyBraceOpen);
  599. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  600. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  601. begin
  602. aName:=GetTokenString;
  603. CheckNextToken(tkColon);
  604. aKeyword:=TServerVariableKeyword.FromString(aName);
  605. case aKeyword of
  606. svkEnum:
  607. ReadObject(aObj.Enum);
  608. svkDefault:
  609. aObj.Default:=Readstring;
  610. svkDescription:
  611. aObj.Description:=Readstring;
  612. else
  613. aObj.Extensions.Add(aName,ReadJSONData);
  614. end;
  615. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  616. if aToken=tkComma then
  617. aToken:=CheckNextToken([tkString,tkIdentifier]);
  618. end;
  619. CheckToken(tkCurlyBraceClose,aToken);
  620. end;
  621. procedure TOpenAPIReader.ReadServerVariableUntyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  622. begin
  623. ReadServerVariable(aObj as TServerVariable,aCheckBracket);
  624. end;
  625. procedure TOpenAPIReader.ReadServerVariableMap(aObj: TServerVariableMap; aCheckBracket: Boolean);
  626. // On entry, we are on { token if aCheckBracket is false, before if it is true
  627. begin
  628. ReadMapObject(aObj,@ReadServerVariableUntyped,aCheckBracket);
  629. end;
  630. procedure TOpenAPIReader.ReadJSONSchemaMap(aObj: TJSONSchemaMap; aCheckBracket: Boolean);
  631. var
  632. atoken : TJSONToken;
  633. aName : String;
  634. Schema : TJSONSchema;
  635. R : TJSONSchemaReader;
  636. begin
  637. if aCheckBracket then
  638. checkNextToken(tkCurlyBraceOpen);
  639. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  640. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  641. begin
  642. aName:=GetTokenString;
  643. Schema:=aObj.Add(aName);
  644. CheckNextToken(tkColon);
  645. R:=TJSONSchemaReader.Create(Nil);
  646. try
  647. R.ReadFromScanner(Schema,FScanner);
  648. finally
  649. R.Free;
  650. end;
  651. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  652. if aToken=tkComma then
  653. aToken:=CheckNextToken([tkString,tkIdentifier]);
  654. end;
  655. CheckToken(tkCurlyBraceClose,aToken);
  656. end;
  657. procedure TOpenAPIReader.ReadJSONSchema(aObj: TJSONSchema; aCheckBracket: Boolean);
  658. var
  659. R : TJSONSchemaReader;
  660. begin
  661. R:=TJSONSchemaReader.Create(Nil);
  662. try
  663. R.ReadFromScanner(aObj,FScanner);
  664. finally
  665. R.Free;
  666. end;
  667. end;
  668. procedure TOpenAPIReader.ReadComponents(aObj: TComponents; aCheckBracket: Boolean);
  669. // On entry, we are on { token if aCheckBracket is false, before if it is true
  670. var
  671. atoken : TJSONToken;
  672. aName : String;
  673. aKeyword : TComponentsKeyword;
  674. begin
  675. if aCheckBracket then
  676. checkNextToken(tkCurlyBraceOpen);
  677. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  678. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  679. begin
  680. aName:=GetTokenString;
  681. CheckNextToken(tkColon);
  682. aKeyword:=TComponentsKeyword.FromString(aName);
  683. case aKeyword of
  684. ckSchemas:
  685. ReadJSONSchemaMap(aObj.Schemas);
  686. ckResponses:
  687. ReadResponseOrReferenceMap(aObj.Responses);
  688. ckParameters:
  689. ReadParameterOrReferenceMap(aObj.Parameters);
  690. ckExamples:
  691. ReadExampleOrReferenceMap(aObj.Examples);
  692. ckRequestBodies:
  693. ReadRequestBodyOrReferenceMap(aObj.RequestBodies);
  694. ckHeaders:
  695. ReadHeaderOrReferenceMap(aObj.Headers);
  696. ckSecuritySchemes:
  697. ReadSecuritySchemeOrReferenceMap(aObj.SecuritySchemes);
  698. ckLinks:
  699. ReadLinkOrReferenceMap(aObj.Links);
  700. ckCallbacks:
  701. ReadLinkOrReferenceMap(aObj.Callbacks);
  702. ckPathItems:
  703. ReadPathItemOrReferenceMap(aObj.PathItems);
  704. else
  705. aObj.Extensions.Add(aName,ReadJSONData);
  706. end;
  707. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  708. if aToken=tkComma then
  709. aToken:=CheckNextToken([tkString,tkIdentifier]);
  710. end;
  711. CheckToken(tkCurlyBraceClose,aToken);
  712. end;
  713. procedure TOpenAPIReader.ReadPathItem(aObj: TPathItem; aCheckBracket: Boolean);
  714. // On entry, we are on { token if aCheckBracket is false, before if it is true
  715. var
  716. atoken : TJSONToken;
  717. aName : String;
  718. aKeyword : TPathItemKeyword;
  719. begin
  720. if aCheckBracket then
  721. checkNextToken(tkCurlyBraceOpen);
  722. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  723. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  724. begin
  725. aName:=GetTokenString;
  726. CheckNextToken(tkColon);
  727. aKeyword:=TPathItemKeyword.FromString(aName);
  728. case aKeyword of
  729. pkRef:
  730. aObj.Ref:=Readstring;
  731. pkSummary:
  732. aObj.Summary:=Readstring;
  733. pkDescription:
  734. aObj.Description:=Readstring;
  735. pkGet:
  736. ReadApiOperation(aObj.Get);
  737. pkPut:
  738. ReadApiOperation(aObj.Put);
  739. pkPost:
  740. ReadApiOperation(aObj.Post);
  741. pkDelete:
  742. ReadApiOperation(aObj.Delete);
  743. pkOptions:
  744. ReadApiOperation(aObj.Options);
  745. pkHead:
  746. ReadApiOperation(aObj.Head);
  747. pkPatch:
  748. ReadApiOperation(aObj.Patch);
  749. pkTrace:
  750. ReadApiOperation(aObj.Trace);
  751. pkServers:
  752. ReadServerList(aObj.Servers);
  753. pkParameters:
  754. ReadParameterOrReferenceList(aObj.Parameters);
  755. else
  756. aObj.Extensions.Add(aName,ReadJSONData);
  757. end;
  758. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  759. if aToken=tkComma then
  760. aToken:=CheckNextToken([tkString,tkIdentifier]);
  761. end;
  762. CheckToken(tkCurlyBraceClose,aToken);
  763. end;
  764. procedure TOpenAPIReader.ReadPathItemOrReference(aObj: TPathItemOrReference; aCheckBracket: Boolean);
  765. // On entry, we are on { token if aCheckBracket is false, before if it is true
  766. var
  767. atoken : TJSONToken;
  768. aName : String;
  769. aKeyword : TPathItemKeyword;
  770. begin
  771. if aCheckBracket then
  772. checkNextToken(tkCurlyBraceOpen);
  773. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  774. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  775. begin
  776. aName:=GetTokenString;
  777. CheckNextToken(tkColon);
  778. aKeyword:=TPathItemKeyword.FromString(aName);
  779. case aKeyword of
  780. pkRef:
  781. aObj.Ref:=Readstring;
  782. pkSummary:
  783. aObj.Summary:=Readstring;
  784. pkDescription:
  785. aObj.Description:=Readstring;
  786. pkGet:
  787. ReadApiOperation(aObj.Get);
  788. pkPut:
  789. ReadApiOperation(aObj.Put);
  790. pkPost:
  791. ReadApiOperation(aObj.Post);
  792. pkDelete:
  793. ReadApiOperation(aObj.Delete);
  794. pkOptions:
  795. ReadApiOperation(aObj.Options);
  796. pkHead:
  797. ReadApiOperation(aObj.Head);
  798. pkPatch:
  799. ReadApiOperation(aObj.Patch);
  800. pkTrace:
  801. ReadApiOperation(aObj.Trace);
  802. pkServers:
  803. ReadServerList(aObj.Servers);
  804. pkParameters:
  805. ReadParameterOrReferenceList(aObj.Parameters);
  806. else
  807. aObj.Extensions.Add(aName,ReadJSONData);
  808. end;
  809. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  810. if aToken=tkComma then
  811. aToken:=CheckNextToken([tkString,tkIdentifier]);
  812. end;
  813. CheckToken(tkCurlyBraceClose,aToken);
  814. end;
  815. procedure TOpenAPIReader.ReadPathItemOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  816. begin
  817. ReadPathItemOrReference(aObj as TPathItemOrReference,aCheckBracket);
  818. end;
  819. procedure TOpenAPIReader.ReadPathItemOrReferenceMap(aObj: TPathItemOrReferenceMap; aCheckBracket: Boolean);
  820. // On entry, we are on { token if aCheckBracket is false, before if it is true
  821. begin
  822. ReadMapObject(aObj,@ReadPathItemOrReferenceUnTyped,aCheckBracket);
  823. end;
  824. procedure TOpenAPIReader.ReadApiOperation(aObj: TApiOperation; aCheckBracket: Boolean);
  825. // On entry, we are on { token if aCheckBracket is false, before if it is true
  826. var
  827. atoken : TJSONToken;
  828. aName : String;
  829. aKeyword : TApiOperationKeyword;
  830. begin
  831. if aCheckBracket then
  832. checkNextToken(tkCurlyBraceOpen);
  833. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  834. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  835. begin
  836. aName:=GetTokenString;
  837. CheckNextToken(tkColon);
  838. aKeyword:=TApiOperationKeyword.FromString(aName);
  839. case aKeyword of
  840. okTags:
  841. ReadObject(aObj.Tags);
  842. okSummary:
  843. aObj.Summary:=Readstring;
  844. okDescription:
  845. aObj.Description:=Readstring;
  846. okExternalDocs:
  847. ReadExternalDocumentation(aObj.ExternalDocs);
  848. okOperationId:
  849. aObj.OperationId:=Readstring;
  850. okParameters:
  851. ReadParameterOrReferenceList(aObj.Parameters);
  852. okRequestBody:
  853. ReadRequestBody(aObj.RequestBody);
  854. okResponses:
  855. ReadResponses(aObj.Responses);
  856. okCallbacks:
  857. ReadCallBackOrReferenceMap(aObj.Callbacks);
  858. okDeprecated:
  859. aObj.Deprecated:=ReadBoolean;
  860. okSecurity:
  861. ReadSecurityRequirementList(aObj.Security);
  862. okServers:
  863. ReadServerList(aObj.Servers);
  864. else
  865. aObj.Extensions.Add(aName,ReadJSONData);
  866. end;
  867. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  868. if aToken=tkComma then
  869. aToken:=CheckNextToken([tkString,tkIdentifier]);
  870. end;
  871. CheckToken(tkCurlyBraceClose,aToken);
  872. end;
  873. procedure TOpenAPIReader.ReadExternalDocumentation(aObj: TExternalDocumentation; aCheckBracket: Boolean);
  874. // On entry, we are on { token if aCheckBracket is false, before if it is true
  875. var
  876. atoken : TJSONToken;
  877. aName : String;
  878. aKeyword : TExternalDocumentationKeyword;
  879. begin
  880. if aCheckBracket then
  881. checkNextToken(tkCurlyBraceOpen);
  882. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  883. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  884. begin
  885. aName:=GetTokenString;
  886. CheckNextToken(tkColon);
  887. aKeyword:=TExternalDocumentationKeyword.FromString(aName);
  888. case aKeyword of
  889. edkDescription:
  890. aObj.Description:=Readstring;
  891. edkUrl:
  892. aObj.Url:=Readstring;
  893. else
  894. aObj.Extensions.Add(aName,ReadJSONData);
  895. end;
  896. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  897. if aToken=tkComma then
  898. aToken:=CheckNextToken([tkString,tkIdentifier]);
  899. end;
  900. CheckToken(tkCurlyBraceClose,aToken);
  901. end;
  902. procedure TOpenAPIReader.ReadParameter(aObj: TParameter; aCheckBracket: Boolean);
  903. begin
  904. DoReadObject(aObj,aCheckBracket);
  905. end;
  906. procedure TOpenAPIReader.DoReadObject(aObj: TParameterOrHeader; aCheckBracket: Boolean);
  907. // On entry, we are on { token if aCheckBracket is false, before if it is true
  908. var
  909. atoken : TJSONToken;
  910. aName : String;
  911. begin
  912. if aCheckBracket then
  913. checkNextToken(tkCurlyBraceOpen);
  914. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  915. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  916. begin
  917. aName:=GetTokenString;
  918. CheckNextToken(tkColon);
  919. HandleParamOrHeader(aObj,aName);
  920. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  921. if aToken=tkComma then
  922. aToken:=CheckNextToken([tkString,tkIdentifier]);
  923. end;
  924. CheckToken(tkCurlyBraceClose,aToken);
  925. end;
  926. function TOpenAPIReader.ReadObjectArray(aList: TFPObjectList; aGetObject : TCreateAndReadObjectFunc): integer;
  927. var
  928. Item: TBaseOpenAPIObject;
  929. aToken: TJSONToken;
  930. begin
  931. Result:=0;
  932. CheckNextToken(tkSquaredBraceOpen);
  933. aToken:=GetToken;
  934. while not (aToken in [tkEOF,tkSquaredBraceClose]) do
  935. begin
  936. case aToken of
  937. tkComma:
  938. ;
  939. tkCurlyBraceOpen:
  940. begin
  941. Item:=aGetObject(Nil,IntToStr(Result));
  942. aList.Add(Item);
  943. Inc(Result);
  944. end;
  945. else
  946. InvalidToken(aToken);
  947. end;
  948. aToken:=GetToken;
  949. end;
  950. CheckToken(tkSquaredBraceClose,aToken);
  951. end;
  952. procedure TOpenAPIReader.ReadParameterOrReference(aObj: TParameterOrReference; aCheckBracket: Boolean);
  953. // On entry, we are on { token if aCheckBracket is false, before if it is true
  954. var
  955. atoken : TJSONToken;
  956. aName : String;
  957. aKeyword : TParameterKeyword;
  958. begin
  959. if aCheckBracket then
  960. checkNextToken(tkCurlyBraceOpen);
  961. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  962. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  963. begin
  964. aName:=GetTokenString;
  965. CheckNextToken(tkColon);
  966. aKeyword:=TParameterKeyword.FromString(aName);
  967. case aKeyword of
  968. pakName:
  969. aObj.Name:=Readstring;
  970. pakIn:
  971. aObj.In_:=Readstring;
  972. pakDescription:
  973. aObj.Description:=Readstring;
  974. pakRequired:
  975. aObj.Required:=ReadBoolean;
  976. pakDeprecated:
  977. aObj.Deprecated:=ReadBoolean;
  978. pakAllowEmptyValue:
  979. aObj.AllowEmptyValue:=ReadBoolean;
  980. pakStyle:
  981. aObj.Style:=Readstring;
  982. pakExplode:
  983. aObj.Explode:=ReadBoolean;
  984. pakAllowReserved:
  985. aObj.AllowReserved:=ReadBoolean;
  986. pakSchema:
  987. ReadJSONSchema(aObj.Schema);
  988. pakExample:
  989. aObj.Example:=ReadJSONData;
  990. pakExamples:
  991. ReadExampleOrReferenceMap(aObj.Examples);
  992. pakContent:
  993. ReadMediaTypeMap(aObj.Content);
  994. else
  995. aObj.Extensions.Add(aName,ReadJSONData);
  996. end;
  997. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  998. if aToken=tkComma then
  999. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1000. end;
  1001. CheckToken(tkCurlyBraceClose,aToken);
  1002. end;
  1003. function TOpenAPIReader.ReadParameterOrReferenceObject(aParent: TBaseOpenAPIObject; aName: TJSONStringType): TBaseOpenAPIObject;
  1004. begin
  1005. Result:=TParameterOrReference.Create(aParent,aName);
  1006. try
  1007. ReadParameterOrReference(TParameterOrReference(Result),False);
  1008. except
  1009. Result.Free;
  1010. Raise;
  1011. end;
  1012. end;
  1013. procedure TOpenAPIReader.ReadParameterOrReferenceList(aObj: TParameterOrReferenceList);
  1014. begin
  1015. ReadObjectArray(aObj,@ReadParameterOrReferenceObject);
  1016. end;
  1017. procedure TOpenAPIReader.ReadParameterOrReferenceUntyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  1018. begin
  1019. ReadParameterOrReference(aObj as TParameterOrReference,aCheckBracket);
  1020. end;
  1021. procedure TOpenAPIReader.ReadParameterOrReferenceMap(aObj: TParameterOrReferenceMap; aCheckBracket: Boolean);
  1022. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1023. begin
  1024. ReadMapObject(aObj,@ReadParameterOrReferenceUnTyped,aCheckBracket);
  1025. end;
  1026. procedure TOpenAPIReader.ReadParameterStyle(aObj: TParameterStyle; aCheckBracket: Boolean);
  1027. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1028. var
  1029. atoken : TJSONToken;
  1030. aName : String;
  1031. aKeyword : TParameterStyleKeyword;
  1032. begin
  1033. if aCheckBracket then
  1034. checkNextToken(tkCurlyBraceOpen);
  1035. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1036. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1037. begin
  1038. aName:=GetTokenString;
  1039. CheckNextToken(tkColon);
  1040. aKeyword:=TParameterStyleKeyword.FromString(aName);
  1041. case aKeyword of
  1042. pskMatrix:
  1043. aObj.Matrix:=Readstring;
  1044. pskLabel:
  1045. aObj.Label_:=Readstring;
  1046. pskForm:
  1047. aObj.Form:=Readstring;
  1048. pskSimple:
  1049. aObj.Simple:=Readstring;
  1050. pskSpaceDelimited:
  1051. aObj.SpaceDelimited:=Readstring;
  1052. pskPipeDelimited:
  1053. aObj.PipeDelimited:=Readstring;
  1054. pskDeepObject:
  1055. aObj.DeepObject:=Readstring;
  1056. else
  1057. aObj.Extensions.Add(aName,ReadJSONData);
  1058. end;
  1059. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1060. if aToken=tkComma then
  1061. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1062. end;
  1063. CheckToken(tkCurlyBraceClose,aToken);
  1064. end;
  1065. procedure TOpenAPIReader.ReadRequestBody(aObj: TRequestBody; aCheckBracket: Boolean);
  1066. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1067. var
  1068. atoken : TJSONToken;
  1069. aName : String;
  1070. aKeyword : TRequestBodyKeyword;
  1071. begin
  1072. if aCheckBracket then
  1073. checkNextToken(tkCurlyBraceOpen);
  1074. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1075. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1076. begin
  1077. aName:=GetTokenString;
  1078. CheckNextToken(tkColon);
  1079. aKeyword:=TRequestBodyKeyword.FromString(aName);
  1080. case aKeyword of
  1081. rbkDescription:
  1082. aObj.Description:=Readstring;
  1083. rbkContent:
  1084. ReadMediaTypeMap(aObj.Content);
  1085. rbkRequired:
  1086. aObj.Required:=ReadBoolean;
  1087. else
  1088. aObj.Extensions.Add(aName,ReadJSONData);
  1089. end;
  1090. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1091. if aToken=tkComma then
  1092. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1093. end;
  1094. CheckToken(tkCurlyBraceClose,aToken);
  1095. end;
  1096. procedure TOpenAPIReader.ReadRequestBodyOrReference(aObj: TRequestBodyOrReference; aCheckBracket: Boolean);
  1097. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1098. var
  1099. atoken : TJSONToken;
  1100. aName : String;
  1101. aKeyword : TRequestBodyKeyword;
  1102. begin
  1103. if aCheckBracket then
  1104. checkNextToken(tkCurlyBraceOpen);
  1105. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1106. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1107. begin
  1108. aName:=GetTokenString;
  1109. CheckNextToken(tkColon);
  1110. aKeyword:=TRequestBodyKeyword.FromString(aName);
  1111. case aKeyword of
  1112. rbkDescription:
  1113. aObj.Description:=Readstring;
  1114. rbkContent:
  1115. ReadMediaTypeMap(aObj.Content);
  1116. rbkRequired:
  1117. aObj.Required:=ReadBoolean;
  1118. else
  1119. aObj.Extensions.Add(aName,ReadJSONData);
  1120. end;
  1121. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1122. if aToken=tkComma then
  1123. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1124. end;
  1125. CheckToken(tkCurlyBraceClose,aToken);
  1126. end;
  1127. procedure TOpenAPIReader.ReadRequestBodyOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  1128. begin
  1129. ReadRequestBodyOrReference(aObj as TRequestBodyOrReference,aCheckBracket);
  1130. end;
  1131. procedure TOpenAPIReader.ReadRequestBodyOrReferenceMap(aObj: TRequestBodyOrReferenceMap; aCheckBracket: Boolean);
  1132. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1133. begin
  1134. ReadMapObject(aObj,@ReadRequestBodyOrReferenceUnTyped,aCheckBracket);
  1135. end;
  1136. procedure TOpenAPIReader.ReadMediaType(aObj: TMediaType; aCheckBracket: Boolean);
  1137. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1138. var
  1139. atoken : TJSONToken;
  1140. aName : String;
  1141. aKeyword : TMediaTypeKeyword;
  1142. begin
  1143. if aCheckBracket then
  1144. checkNextToken(tkCurlyBraceOpen);
  1145. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1146. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1147. begin
  1148. aName:=GetTokenString;
  1149. CheckNextToken(tkColon);
  1150. aKeyword:=TMediaTypeKeyword.FromString(aName);
  1151. case aKeyword of
  1152. mtkSchema:
  1153. ReadJSONSchema(aObj.Schema);
  1154. mtkExample:
  1155. aObj.Example:=ReadJSONData;
  1156. mtkExamples:
  1157. ReadExampleOrReferenceMap(aObj.Examples);
  1158. mtkEncoding:
  1159. ReadEncodingMap(aObj.Encoding);
  1160. else
  1161. aObj.Extensions.Add(aName,ReadJSONData);
  1162. end;
  1163. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1164. if aToken=tkComma then
  1165. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1166. end;
  1167. CheckToken(tkCurlyBraceClose,aToken);
  1168. end;
  1169. procedure TOpenAPIReader.ReadMediaTypeUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  1170. begin
  1171. ReadMediaType(aObj as TMediaType,aCheckBracket);
  1172. end;
  1173. procedure TOpenAPIReader.ReadMediaTypeMap(aObj: TMediaTypeMap; aCheckBracket: Boolean);
  1174. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1175. begin
  1176. ReadMapObject(aObj,@ReadMediaTypeUntyped,aCheckBracket);
  1177. end;
  1178. procedure TOpenAPIReader.ReadEncoding(aObj: TEncoding; aCheckBracket: Boolean);
  1179. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1180. var
  1181. atoken : TJSONToken;
  1182. aName : String;
  1183. aKeyword : TEncodingKeyword;
  1184. begin
  1185. if aCheckBracket then
  1186. checkNextToken(tkCurlyBraceOpen);
  1187. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1188. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1189. begin
  1190. aName:=GetTokenString;
  1191. CheckNextToken(tkColon);
  1192. aKeyword:=TEncodingKeyword.FromString(aName);
  1193. case aKeyword of
  1194. eckContentType:
  1195. aObj.ContentType:=Readstring;
  1196. eckHeaders:
  1197. ReadHeaderOrReferenceMap(aObj.Headers);
  1198. eckStyle:
  1199. aObj.Style:=Readstring;
  1200. eckExplode:
  1201. aObj.Explode:=ReadBoolean;
  1202. eckAllowReserved:
  1203. aObj.AllowReserved:=ReadBoolean;
  1204. else
  1205. aObj.Extensions.Add(aName,ReadJSONData);
  1206. end;
  1207. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1208. if aToken=tkComma then
  1209. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1210. end;
  1211. CheckToken(tkCurlyBraceClose,aToken);
  1212. end;
  1213. procedure TOpenAPIReader.ReadEncodingUntyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  1214. begin
  1215. ReadEncoding(aObj as TEncoding,aCheckBracket);
  1216. end;
  1217. procedure TOpenAPIReader.ReadEncodingMap(aObj: TEncodingMap; aCheckBracket: Boolean);
  1218. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1219. begin
  1220. ReadMapObject(aObj,@ReadEncodingUntyped,aCheckBracket);
  1221. end;
  1222. procedure TOpenAPIReader.ReadResponses(aObj: TResponses; aCheckBracket: Boolean);
  1223. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1224. var
  1225. atoken : TJSONToken;
  1226. aName : String;
  1227. Itm : TResponse;
  1228. begin
  1229. if aCheckBracket then
  1230. checkNextToken(tkCurlyBraceOpen);
  1231. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1232. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1233. begin
  1234. aName:=GetTokenString;
  1235. CheckNextToken(tkColon);
  1236. Itm:=aObj.AddItem(aName);
  1237. ReadResponse(Itm);
  1238. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1239. if aToken=tkComma then
  1240. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1241. end;
  1242. CheckToken(tkCurlyBraceClose,aToken);
  1243. end;
  1244. procedure TOpenAPIReader.ReadResponse(aObj: TResponse; aCheckBracket: Boolean);
  1245. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1246. var
  1247. atoken : TJSONToken;
  1248. aName : String;
  1249. aKeyword : TResponseKeyword;
  1250. begin
  1251. if aCheckBracket then
  1252. checkNextToken(tkCurlyBraceOpen);
  1253. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1254. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1255. begin
  1256. aName:=GetTokenString;
  1257. CheckNextToken(tkColon);
  1258. aKeyword:=TResponseKeyword.FromString(aName);
  1259. case aKeyword of
  1260. rkDescription:
  1261. aObj.Description:=Readstring;
  1262. rkHeaders:
  1263. ReadHeaderOrReferenceMap(aObj.Headers);
  1264. rkContent:
  1265. ReadMediaTypeMap(aObj.Content);
  1266. rkLinks:
  1267. ReadLinkOrReferenceMap(aObj.Links);
  1268. else
  1269. aObj.Extensions.Add(aName,ReadJSONData);
  1270. end;
  1271. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1272. if aToken=tkComma then
  1273. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1274. end;
  1275. CheckToken(tkCurlyBraceClose,aToken);
  1276. end;
  1277. procedure TOpenAPIReader.ReadResponseOrReference(aObj: TResponseOrReference; aCheckBracket: Boolean);
  1278. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1279. var
  1280. atoken : TJSONToken;
  1281. aName : String;
  1282. aKeyword : TResponseKeyword;
  1283. begin
  1284. if aCheckBracket then
  1285. checkNextToken(tkCurlyBraceOpen);
  1286. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1287. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1288. begin
  1289. aName:=GetTokenString;
  1290. CheckNextToken(tkColon);
  1291. aKeyword:=TResponseKeyword.FromString(aName);
  1292. case aKeyword of
  1293. rkDescription:
  1294. aObj.Description:=Readstring;
  1295. rkHeaders:
  1296. ReadHeaderOrReferenceMap(aObj.Headers);
  1297. rkContent:
  1298. ReadMediaTypeMap(aObj.Content);
  1299. rkLinks:
  1300. ReadLinkOrReferenceMap(aObj.Links);
  1301. else
  1302. aObj.Extensions.Add(aName,ReadJSONData);
  1303. end;
  1304. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1305. if aToken=tkComma then
  1306. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1307. end;
  1308. CheckToken(tkCurlyBraceClose,aToken);
  1309. end;
  1310. procedure TOpenAPIReader.ReadResponseOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  1311. begin
  1312. ReadResponseOrReference(aObj as TResponseOrReference, aCheckBracket);
  1313. end;
  1314. procedure TOpenAPIReader.ReadResponseOrReferenceMap(aObj: TResponseOrReferenceMap; aCheckBracket: Boolean);
  1315. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1316. begin
  1317. ReadMapObject(aObj,@ReadResponseOrReferenceUnTyped,aCheckBracket);
  1318. end;
  1319. procedure TOpenAPIReader.ReadExample(aObj: TExample; aCheckBracket: Boolean);
  1320. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1321. var
  1322. atoken : TJSONToken;
  1323. aName : String;
  1324. aKeyword : TExampleKeyword;
  1325. begin
  1326. if aCheckBracket then
  1327. checkNextToken(tkCurlyBraceOpen);
  1328. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1329. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1330. begin
  1331. aName:=GetTokenString;
  1332. CheckNextToken(tkColon);
  1333. aKeyword:=TExampleKeyword.FromString(aName);
  1334. case aKeyword of
  1335. exkSummary:
  1336. aObj.Summary:=Readstring;
  1337. exkDescription:
  1338. aObj.Description:=Readstring;
  1339. exkValue:
  1340. aObj.Value:=ReadJSONData;
  1341. exkExternalValue:
  1342. aObj.ExternalValue:=Readstring;
  1343. else
  1344. aObj.Extensions.Add(aName,ReadJSONData);
  1345. end;
  1346. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1347. if aToken=tkComma then
  1348. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1349. end;
  1350. CheckToken(tkCurlyBraceClose,aToken);
  1351. end;
  1352. procedure TOpenAPIReader.ReadExampleOrReference(aObj: TExampleOrReference; aCheckBracket: Boolean);
  1353. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1354. var
  1355. atoken : TJSONToken;
  1356. aName : String;
  1357. aKeyword : TExampleKeyword;
  1358. begin
  1359. if aCheckBracket then
  1360. checkNextToken(tkCurlyBraceOpen);
  1361. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1362. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1363. begin
  1364. aName:=GetTokenString;
  1365. CheckNextToken(tkColon);
  1366. aKeyword:=TExampleKeyword.FromString(aName);
  1367. case aKeyword of
  1368. exkSummary:
  1369. aObj.Summary:=Readstring;
  1370. exkDescription:
  1371. aObj.Description:=Readstring;
  1372. exkValue:
  1373. aObj.Value:=ReadJSONData;
  1374. exkExternalValue:
  1375. aObj.ExternalValue:=Readstring;
  1376. else
  1377. aObj.Extensions.Add(aName,ReadJSONData);
  1378. end;
  1379. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1380. if aToken=tkComma then
  1381. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1382. end;
  1383. CheckToken(tkCurlyBraceClose,aToken);
  1384. end;
  1385. procedure TOpenAPIReader.ReadExampleOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  1386. begin
  1387. ReadExampleOrReference(aObj as TExampleOrReference,aCheckBracket);
  1388. end;
  1389. procedure TOpenAPIReader.ReadExampleOrReferenceMap(aObj: TExampleOrReferenceMap; aCheckBracket: Boolean);
  1390. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1391. begin
  1392. ReadMapObject(aObj,@ReadExampleOrReferenceUnTyped,aCheckBracket);
  1393. end;
  1394. procedure TOpenAPIReader.ReadLink(aObj: TLink; aCheckBracket: Boolean);
  1395. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1396. var
  1397. atoken : TJSONToken;
  1398. aName : String;
  1399. aKeyword : TLinkKeyword;
  1400. begin
  1401. if aCheckBracket then
  1402. checkNextToken(tkCurlyBraceOpen);
  1403. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1404. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1405. begin
  1406. aName:=GetTokenString;
  1407. CheckNextToken(tkColon);
  1408. aKeyword:=TLinkKeyword.FromString(aName);
  1409. case aKeyword of
  1410. likOperationRef:
  1411. aObj.OperationRef:=Readstring;
  1412. likOperationId:
  1413. aObj.OperationId:=Readstring;
  1414. likParameters:
  1415. ReadJSONObject(aObj.Parameters);
  1416. likRequestBody:
  1417. aObj.RequestBody:=ReadJSONData;
  1418. likDescription:
  1419. aObj.Description:=Readstring;
  1420. likServer:
  1421. ReadServer(aObj.Server);
  1422. else
  1423. aObj.Extensions.Add(aName,ReadJSONData);
  1424. end;
  1425. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1426. if aToken=tkComma then
  1427. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1428. end;
  1429. CheckToken(tkCurlyBraceClose,aToken);
  1430. end;
  1431. procedure TOpenAPIReader.ReadLinkOrReference(aObj: TLinkOrReference; aCheckBracket: Boolean);
  1432. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1433. var
  1434. atoken : TJSONToken;
  1435. aName : String;
  1436. aKeyword : TLinkKeyword;
  1437. begin
  1438. if aCheckBracket then
  1439. checkNextToken(tkCurlyBraceOpen);
  1440. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1441. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1442. begin
  1443. aName:=GetTokenString;
  1444. CheckNextToken(tkColon);
  1445. aKeyword:=TLinkKeyword.FromString(aName);
  1446. case aKeyword of
  1447. likOperationRef:
  1448. aObj.OperationRef:=Readstring;
  1449. likOperationId:
  1450. aObj.OperationId:=Readstring;
  1451. likParameters:
  1452. ReadJSONObject(aObj.Parameters);
  1453. likRequestBody:
  1454. aObj.RequestBody:=ReadJSONData;
  1455. likDescription:
  1456. aObj.Description:=Readstring;
  1457. likServer:
  1458. ReadServer(aObj.Server);
  1459. else
  1460. aObj.Extensions.Add(aName,ReadJSONData);
  1461. end;
  1462. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1463. if aToken=tkComma then
  1464. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1465. end;
  1466. CheckToken(tkCurlyBraceClose,aToken);
  1467. end;
  1468. procedure TOpenAPIReader.ReadLinkOrReferenceUntyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  1469. begin
  1470. ReadLinkOrReference(aObj as TLinkOrReference,aCheckbracket)
  1471. end;
  1472. procedure TOpenAPIReader.ReadLinkOrReferenceMap(aObj: TLinkOrReferenceMap; aCheckBracket: Boolean);
  1473. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1474. begin
  1475. ReadMapObject(aObj,@ReadLinkOrReferenceUntyped,aCheckBracket);
  1476. end;
  1477. procedure TOpenAPIReader.ReadTag(aObj: TTag; aCheckBracket: Boolean);
  1478. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1479. var
  1480. atoken : TJSONToken;
  1481. aName : String;
  1482. aKeyword : TTagKeyword;
  1483. begin
  1484. if aCheckBracket then
  1485. checkNextToken(tkCurlyBraceOpen);
  1486. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1487. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1488. begin
  1489. aName:=GetTokenString;
  1490. CheckNextToken(tkColon);
  1491. aKeyword:=TTagKeyword.FromString(aName);
  1492. case aKeyword of
  1493. tkName:
  1494. aObj.Name:=Readstring;
  1495. tkDescription:
  1496. aObj.Description:=Readstring;
  1497. tkExternalDocs:
  1498. ReadExternalDocumentation(aObj.ExternalDocs);
  1499. else
  1500. aObj.Extensions.Add(aName,ReadJSONData);
  1501. end;
  1502. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1503. if aToken=tkComma then
  1504. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1505. end;
  1506. CheckToken(tkCurlyBraceClose,aToken);
  1507. end;
  1508. procedure TOpenAPIReader.ReadReference(aObj: TReference; aCheckBracket: Boolean);
  1509. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1510. var
  1511. atoken : TJSONToken;
  1512. aName : String;
  1513. aKeyword : TReferenceKeyword;
  1514. begin
  1515. if aCheckBracket then
  1516. checkNextToken(tkCurlyBraceOpen);
  1517. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1518. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1519. begin
  1520. aName:=GetTokenString;
  1521. CheckNextToken(tkColon);
  1522. aKeyword:=TReferenceKeyword.FromString(aName);
  1523. case aKeyword of
  1524. rfkRef:
  1525. aObj.Ref:=Readstring;
  1526. rfkSummary:
  1527. aObj.Summary:=Readstring;
  1528. rfkDescription:
  1529. aObj.Description:=Readstring;
  1530. else
  1531. aObj.Extensions.Add(aName,ReadJSONData);
  1532. end;
  1533. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1534. if aToken=tkComma then
  1535. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1536. end;
  1537. CheckToken(tkCurlyBraceClose,aToken);
  1538. end;
  1539. procedure TOpenAPIReader.ReadSchema(aObj: TSchema; aCheckBracket: Boolean);
  1540. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1541. var
  1542. atoken : TJSONToken;
  1543. aName : String;
  1544. aKeyword : TSchemaKeyword;
  1545. begin
  1546. if aCheckBracket then
  1547. checkNextToken(tkCurlyBraceOpen);
  1548. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1549. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1550. begin
  1551. aName:=GetTokenString;
  1552. CheckNextToken(tkColon);
  1553. aKeyword:=TSchemaKeyword.FromString(aName);
  1554. case aKeyword of
  1555. sckDiscriminator:
  1556. ReadDiscriminator(aObj.Discriminator);
  1557. sckXML:
  1558. ReadXML(aObj.XML);
  1559. sckExternalDocs:
  1560. ReadExternalDocumentation(aObj.ExternalDocs);
  1561. sckExample:
  1562. aObj.Example:=ReadJSONData;
  1563. else
  1564. aObj.Extensions.Add(aName,ReadJSONData);
  1565. end;
  1566. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1567. if aToken=tkComma then
  1568. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1569. end;
  1570. CheckToken(tkCurlyBraceClose,aToken);
  1571. end;
  1572. procedure TOpenAPIReader.ReadDiscriminator(aObj: TDiscriminator; aCheckBracket: Boolean);
  1573. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1574. var
  1575. atoken : TJSONToken;
  1576. aName : String;
  1577. aKeyword : TDiscriminatorKeyword;
  1578. begin
  1579. if aCheckBracket then
  1580. checkNextToken(tkCurlyBraceOpen);
  1581. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1582. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1583. begin
  1584. aName:=GetTokenString;
  1585. CheckNextToken(tkColon);
  1586. aKeyword:=TDiscriminatorKeyword.FromString(aName);
  1587. case aKeyword of
  1588. dikPropertyName:
  1589. aObj.PropertyName:=Readstring;
  1590. dikMapping:
  1591. ReadObject(aObj.Mapping);
  1592. else
  1593. aObj.Extensions.Add(aName,ReadJSONData);
  1594. end;
  1595. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1596. if aToken=tkComma then
  1597. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1598. end;
  1599. CheckToken(tkCurlyBraceClose,aToken);
  1600. end;
  1601. procedure TOpenAPIReader.ReadXML(aObj: TXML; aCheckBracket: Boolean);
  1602. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1603. var
  1604. atoken : TJSONToken;
  1605. aName : String;
  1606. aKeyword : TXMLKeyword;
  1607. begin
  1608. if aCheckBracket then
  1609. checkNextToken(tkCurlyBraceOpen);
  1610. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1611. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1612. begin
  1613. aName:=GetTokenString;
  1614. CheckNextToken(tkColon);
  1615. aKeyword:=TXMLKeyword.FromString(aName);
  1616. case aKeyword of
  1617. xmkName:
  1618. aObj.Name:=Readstring;
  1619. xmkNamespace:
  1620. aObj.Namespace:=Readstring;
  1621. xmkPrefix:
  1622. aObj.Prefix:=Readstring;
  1623. xmkAttribute:
  1624. aObj.Attribute:=ReadBoolean;
  1625. xmkWrapped:
  1626. aObj.Wrapped:=ReadBoolean;
  1627. else
  1628. aObj.Extensions.Add(aName,ReadJSONData);
  1629. end;
  1630. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1631. if aToken=tkComma then
  1632. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1633. end;
  1634. CheckToken(tkCurlyBraceClose,aToken);
  1635. end;
  1636. procedure TOpenAPIReader.ReadSecurityScheme(aObj: TSecurityScheme; aCheckBracket: Boolean);
  1637. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1638. var
  1639. atoken : TJSONToken;
  1640. aName : String;
  1641. aKeyword : TSecuritySchemeKeyword;
  1642. begin
  1643. if aCheckBracket then
  1644. checkNextToken(tkCurlyBraceOpen);
  1645. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1646. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1647. begin
  1648. aName:=GetTokenString;
  1649. CheckNextToken(tkColon);
  1650. aKeyword:=TSecuritySchemeKeyword.FromString(aName);
  1651. case aKeyword of
  1652. sskType:
  1653. aObj.Type_:=Readstring;
  1654. sskDescription:
  1655. aObj.Description:=Readstring;
  1656. sskName:
  1657. aObj.Name:=Readstring;
  1658. sskIn:
  1659. aObj.In_:=Readstring;
  1660. sskScheme:
  1661. aObj.Scheme:=Readstring;
  1662. sskBearerFormat:
  1663. aObj.BearerFormat:=Readstring;
  1664. sskFlows:
  1665. ReadOAuthFlows(aObj.Flows);
  1666. sskOpenIdConnectUrl:
  1667. aObj.OpenIdConnectUrl:=Readstring;
  1668. else
  1669. aObj.Extensions.Add(aName,ReadJSONData);
  1670. end;
  1671. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1672. if aToken=tkComma then
  1673. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1674. end;
  1675. CheckToken(tkCurlyBraceClose,aToken);
  1676. end;
  1677. procedure TOpenAPIReader.ReadSecuritySchemeOrReference(aObj: TSecuritySchemeOrReference; aCheckBracket: Boolean);
  1678. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1679. var
  1680. atoken : TJSONToken;
  1681. aName : String;
  1682. aKeyword : TSecuritySchemeKeyword;
  1683. begin
  1684. if aCheckBracket then
  1685. checkNextToken(tkCurlyBraceOpen);
  1686. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1687. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1688. begin
  1689. aName:=GetTokenString;
  1690. CheckNextToken(tkColon);
  1691. aKeyword:=TSecuritySchemeKeyword.FromString(aName);
  1692. case aKeyword of
  1693. sskType:
  1694. aObj.Type_:=Readstring;
  1695. sskDescription:
  1696. aObj.Description:=Readstring;
  1697. sskName:
  1698. aObj.Name:=Readstring;
  1699. sskIn:
  1700. aObj.In_:=Readstring;
  1701. sskScheme:
  1702. aObj.Scheme:=Readstring;
  1703. sskBearerFormat:
  1704. aObj.BearerFormat:=Readstring;
  1705. sskFlows:
  1706. ReadOAuthFlows(aObj.Flows);
  1707. sskOpenIdConnectUrl:
  1708. aObj.OpenIdConnectUrl:=Readstring;
  1709. else
  1710. aObj.Extensions.Add(aName,ReadJSONData);
  1711. end;
  1712. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1713. if aToken=tkComma then
  1714. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1715. end;
  1716. CheckToken(tkCurlyBraceClose,aToken);
  1717. end;
  1718. procedure TOpenAPIReader.ReadSecuritySchemeOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  1719. begin
  1720. ReadSecuritySchemeOrReference(aObj as TSecuritySchemeOrReference,aCheckBracket);
  1721. end;
  1722. procedure TOpenAPIReader.ReadSecuritySchemeOrReferenceMap(aObj: TSecuritySchemeOrReferenceMap; aCheckBracket: Boolean);
  1723. begin
  1724. ReadMapObject(aObj,@ReadSecuritySchemeOrReferenceUntyped,aCheckBracket);
  1725. end;
  1726. procedure TOpenAPIReader.ReadOAuthFlows(aObj: TOAuthFlows; aCheckBracket: Boolean);
  1727. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1728. var
  1729. atoken : TJSONToken;
  1730. aName : String;
  1731. aKeyword : TOAuthFlowsKeyword;
  1732. begin
  1733. if aCheckBracket then
  1734. checkNextToken(tkCurlyBraceOpen);
  1735. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1736. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1737. begin
  1738. aName:=GetTokenString;
  1739. CheckNextToken(tkColon);
  1740. aKeyword:=TOAuthFlowsKeyword.FromString(aName);
  1741. case aKeyword of
  1742. ofskImplicit:
  1743. ReadOauthFlow(aObj.Implicit);
  1744. ofskPassword:
  1745. ReadOauthFlow(aObj.Password);
  1746. ofskClientCredentials:
  1747. ReadOauthFlow(aObj.ClientCredentials);
  1748. ofskClientAuthorizationCode:
  1749. ReadOauthFlow(aObj.ClientAuthorizationCode);
  1750. else
  1751. aObj.Extensions.Add(aName,ReadJSONData);
  1752. end;
  1753. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1754. if aToken=tkComma then
  1755. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1756. end;
  1757. CheckToken(tkCurlyBraceClose,aToken);
  1758. end;
  1759. procedure TOpenAPIReader.ReadOAuthFlow(aObj: TOauthFlow; aCheckBracket: Boolean);
  1760. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1761. var
  1762. atoken : TJSONToken;
  1763. aName : String;
  1764. aKeyword : TOauthFlowKeyword;
  1765. begin
  1766. if aCheckBracket then
  1767. checkNextToken(tkCurlyBraceOpen);
  1768. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1769. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1770. begin
  1771. aName:=GetTokenString;
  1772. CheckNextToken(tkColon);
  1773. aKeyword:=TOauthFlowKeyword.FromString(aName);
  1774. case aKeyword of
  1775. ofkAuthorizationUrl:
  1776. aObj.AuthorizationUrl:=Readstring;
  1777. ofkTokenURL:
  1778. aObj.TokenURL:=Readstring;
  1779. ofkRefreshURL:
  1780. aObj.RefreshURL:=Readstring;
  1781. ofkScopes:
  1782. ReadObject(aObj.Scopes);
  1783. else
  1784. aObj.Extensions.Add(aName,ReadJSONData);
  1785. end;
  1786. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1787. if aToken=tkComma then
  1788. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1789. end;
  1790. CheckToken(tkCurlyBraceClose,aToken);
  1791. end;
  1792. procedure TOpenAPIReader.ReadHeader(aObj: THeader; aCheckBracket: Boolean);
  1793. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1794. begin
  1795. DoReadObject(aObj,aCheckBracket);
  1796. end;
  1797. procedure TOpenAPIReader.ReadHeaderOrReference(aObj: THeaderOrReference; aCheckBracket: Boolean);
  1798. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1799. var
  1800. atoken : TJSONToken;
  1801. aName : String;
  1802. begin
  1803. if aCheckBracket then
  1804. checkNextToken(tkCurlyBraceOpen);
  1805. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1806. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1807. begin
  1808. aName:=GetTokenString;
  1809. CheckNextToken(tkColon);
  1810. if aName='ref' then
  1811. ReadReference(aObj.Reference,True)
  1812. else
  1813. HandleParamOrHeader(aObj,aName);
  1814. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1815. if aToken=tkComma then
  1816. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1817. end;
  1818. CheckToken(tkCurlyBraceClose,aToken);
  1819. end;
  1820. procedure TOpenAPIReader.ReadHeaderOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  1821. begin
  1822. ReadHeaderOrReference(aObj as THeaderOrReference,aCheckBracket)
  1823. end;
  1824. procedure TOpenAPIReader.ReadHeaderOrReferenceMap(aObj: THeaderOrReferenceMap; aCheckBracket: Boolean);
  1825. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1826. begin
  1827. ReadMapObject(aObj,@ReadHeaderOrReferenceUnTyped,aCheckBracket);
  1828. end;
  1829. procedure TOpenAPIReader.ReadCallbackOrReference(aObj: TCallbackOrReference; aCheckBracket: Boolean);
  1830. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1831. var
  1832. atoken : TJSONToken;
  1833. aName : String;
  1834. itm : TPathItem;
  1835. begin
  1836. if aCheckBracket then
  1837. checkNextToken(tkCurlyBraceOpen);
  1838. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1839. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1840. begin
  1841. aName:=GetTokenString;
  1842. CheckNextToken(tkColon);
  1843. case aName of
  1844. 'ref' : ReadReference(aObj.Reference);
  1845. else
  1846. Itm:=aObj.AddItem(Name);
  1847. ReadPathItem(Itm);
  1848. end;
  1849. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1850. if aToken=tkComma then
  1851. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1852. end;
  1853. CheckToken(tkCurlyBraceClose,aToken);
  1854. end;
  1855. procedure TOpenAPIReader.ReadCallbackOrReferenceUnTyped(aObj: TBaseOpenAPIObject; aCheckBracket: Boolean);
  1856. begin
  1857. ReadCallbackOrReference(aObj as TCallbackOrReference,aCheckBracket);
  1858. end;
  1859. procedure TOpenAPIReader.ReadCallbackOrReferenceMap(aObj: TCallbackOrReferenceMap; aCheckBracket: Boolean);
  1860. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1861. begin
  1862. ReadMapObject(aObj,@ReadCallbackOrReferenceUnTyped,aCheckBracket);
  1863. end;
  1864. procedure TOpenAPIReader.ReadSecurityRequirement(aObj: TSecurityRequirement; aCheckBracket: Boolean);
  1865. // On entry, we are on { token if aCheckBracket is false, before if it is true
  1866. var
  1867. atoken : TJSONToken;
  1868. aName : String;
  1869. begin
  1870. if aCheckBracket then
  1871. checkNextToken(tkCurlyBraceOpen);
  1872. aToken:=CheckNextToken([tkString,tkIdentifier,tkCurlyBraceClose]);
  1873. While not (aToken in [tkEOF,tkCurlyBraceClose]) do
  1874. begin
  1875. aName:=GetTokenString;
  1876. CheckNextToken(tkColon);
  1877. ReadObject(aObj.AddItem(aName));
  1878. aToken:=CheckNextToken([tkComma,tkCurlyBraceClose]);
  1879. if aToken=tkComma then
  1880. aToken:=CheckNextToken([tkString,tkIdentifier]);
  1881. end;
  1882. CheckToken(tkCurlyBraceClose,aToken);
  1883. end;
  1884. function TOpenAPIReader.ReadSecurityRequirementObject(aParent: TBaseOpenAPIObject; aName: TJSONStringType): TBaseOpenAPIObject;
  1885. begin
  1886. Result:=TSecurityRequirement.Create(aParent,aName);
  1887. try
  1888. ReadSecurityRequirement(TSecurityRequirement(Result),False);
  1889. except
  1890. Result.Free;
  1891. Raise;
  1892. end;
  1893. end;
  1894. procedure TOpenAPIReader.ReadSecurityRequirementList(aObj: TSecurityRequirementList);
  1895. begin
  1896. ReadObjectArray(aObj,@ReadSecurityRequirementObject);
  1897. end;
  1898. function TOpenAPIReader.ReadTagObject(aParent: TBaseOpenAPIObject; aName: TJSONStringType): TBaseOpenAPIObject;
  1899. begin
  1900. Result:=TTag.Create(aParent,aName);
  1901. try
  1902. ReadTag(TTag(Result),False);
  1903. except
  1904. Result.Free;
  1905. Raise;
  1906. end;
  1907. end;
  1908. procedure TOpenAPIReader.ReadTagList(aObj: TTagList);
  1909. begin
  1910. ReadObjectArray(aObj,@ReadTagObject);
  1911. end;
  1912. procedure TOpenAPIReader.ReadFromScanner(aOpenAPI: TOpenAPI; AScanner: TJSONScanner);
  1913. begin
  1914. FScanner:=aScanner;
  1915. try
  1916. ReadOpenApi(aOpenApi);
  1917. finally
  1918. FScanner:=Nil;
  1919. end;
  1920. end;
  1921. procedure TOpenAPIReader.ReadFromFile(aOpenAPI: TOpenAPI; const AFilename: String);
  1922. var
  1923. F : TFileStream;
  1924. begin
  1925. F:=TFileStream.Create(aFilename,fmOpenRead or fmShareDenyWrite);
  1926. try
  1927. ReadFromStream(aOpenAPI,F);
  1928. finally
  1929. F.Free;
  1930. end;
  1931. end;
  1932. procedure TOpenAPIReader.ReadFromStream(aOpenAPI: TOpenAPI; AStream: TStream);
  1933. var
  1934. S : TJSONScanner;
  1935. begin
  1936. S:=TJSONScanner.Create(aStream,[joUTF8]);
  1937. try
  1938. ReadFromScanner(aOpenAPI,S);
  1939. finally
  1940. S.Free;
  1941. end;
  1942. end;
  1943. procedure TOpenAPIReader.ReadFromString(aOpenAPI: TOpenAPI; const AString: TJSONStringType);
  1944. var
  1945. S: TStringStream;
  1946. begin
  1947. S:=TStringStream.Create(AString);
  1948. try
  1949. ReadFromStream(aOpenAPI,S);
  1950. finally
  1951. S.Free;
  1952. end;
  1953. end;
  1954. end.