| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 | { JSON 2 Pascal class converter  Copyright (C) 2016 Michael Van Canneyt ([email protected])  This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as  published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.  This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.  A copy of the GNU General Public License is available on the World Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can  also obtain it by writing to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.}program json2pas;{$mode objfpc}{$H+}uses  Classes, SysUtils, CustApp, jsonparser, fpjsontopas;type  { TJSON2PasApplication }  TJSON2PasApplication = class(TCustomApplication)  Private    FGen : TJSONToPascal;    FIN : TFileStream;    FON : String;    procedure ProcessOptions;  protected    procedure DoRun; override;  public    constructor Create(TheOwner: TComponent); override;    destructor Destroy; override;    procedure Usage(Msg: String); virtual;  end;{ TJSON2PasApplication }procedure TJSON2PasApplication.ProcessOptions;var  UN,J: String;begin  UN:='';  if HasOption('d','generate-delphi') then    FGen.Options:=FGen.Options+[jpoDelphiJSON];  if HasOption('l','generate-load') then    FGen.Options:=FGen.Options+[jpoGenerateLoad];  if HasOption('s','generate-save') then    FGen.Options:=FGen.Options+[jpoGenerateSave];  if HasOption('c','load-ignores-case') then    FGen.Options:=FGen.Options+[jpoLoadCaseInsensitive];  if HasOption('e','use-setter') then    FGen.Options:=FGen.Options+[jpoUseSetter];  if HasOption('r','load-with-error') then    FGen.Options:=FGen.Options+[jpoUnknownLoadPropsError];  if HasOption('u','unit') then    UN:=GetOptionValue('u','unit');  J:=GetOptionValue('i','input');  if (J<>'') then    begin    FIN:=TFileStream.Create(J,fmOpenRead or fmShareDenyWrite);    FGen.JSONStream:=FIN;    end  else    FGen.JSON:=getOptionValue('j','json');  if HasOption('o','output') then    FON:=GetOptionValue('o','output');  if (FON='') then    begin    if Assigned(FIN) then      FON:=ChangeFileExt(FIN.FileName,'')    else if (UN<>'') then      FON:=UN;    if (UN='') then      UN:=ChangeFileExt(ExtractFileName(FON),'');    end  else    UN:=ChangeFileExt(ExtractFileName(FON),'');  if (ExtractFileExt(FON)='') then    if (jpoDelphiJSON in Fgen.Options) then      FON:=FON+'.pas'    else      FON:=FON+'.pp';  FGen.DestUnitName:=UN;  If HasOption('n','classname') then    FGen.PropertyMap.AddPath('',GetOptionValue('n','classname'));end;procedure TJSON2PasApplication.DoRun;var  ErrorMsg: String;begin  // quick check parameters  ErrorMsg:=CheckOptions('hi:j:u:o:n:dlscer', ['help','input:','output:','unit:','json:','generate-delphi','generate-load','generate-save','load-ignores-case','use-setter','classname:','load-with-error']);  if (ErrorMsg<>'') or HasOption('h', 'help') then    Usage(ErrorMsg);  ProcessOptions;  FGen.Execute;  FGen.Code.SaveToFile(FON);  Terminate;end;constructor TJSON2PasApplication.Create(TheOwner: TComponent);begin  inherited Create(TheOwner);  StopOnException:=True;  FGen:=TJSONToPascal.Create(Self);end;destructor TJSON2PasApplication.Destroy;begin  FreeAndNil(FGen);  FreeAndNil(FIN);  inherited Destroy;end;procedure TJSON2PasApplication.Usage(Msg : String);begin  if (Msg<>'') then    Writeln('Error : ',Msg);  writeln('Usage: ', ExeName, ' [options]');  Writeln('Where options is one or more of:');// 'hi:j:u:o:n:dlscer', ['help','input:','output:','unit:','json:','generate-delphi','generate-load','generate-save','load-ignores-case','use-setter','classname:','load-with-error']);  Writeln('-h --help              Show this help');  Writeln('-i --input=file        Use file as JSON input. The file must contain a valid JSON object.');  Writeln('-i --json=json         Use json as JSON input. The value must contain a valid JSON object.');  Writeln('-u --unit=name         Use name as the name of the unit.');  Writeln('                       If no output file is specified, this sets the name');  Writeln('-o --output=file       Set the output filename. Sets the unit name if none is given');  Writeln('-d --generate-delphi   Use Delphi 10 JSON routines');  Writeln('-l --generate-load     Create LoadFromJSON routine');  Writeln('-s --generate-save     Create SaveToJSON routine');  Writeln('-c --load-ignores-case The LoadFromJSON routine will ignore case');  Writeln('-e --use-setter        Property setters use a routine instead of writing to field');  Writeln('-n --classname=name    Set the name of the top-level class (default: TMyObject)');  Writeln('-r --load-with-error   Load will raise an exception if an unknown property is met');  Halt(Ord(Msg<>''));end;var  Application: TJSON2PasApplication;begin  Application:=TJSON2PasApplication.Create(nil);  Application.Title:='JSON to Pascal code generator';  Application.Run;  Application.Free;end.
 |