-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDPM.Creator.Dspec.FileHandler.pas
172 lines (146 loc) · 3.99 KB
/
DPM.Creator.Dspec.FileHandler.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
unit DPM.Creator.Dspec.FileHandler;
interface
uses
System.JSON,
DPM.Core.Logging,
DPM.Core.Spec.Interfaces,
DPM.Core.Spec.Reader,
DPM.Core.Spec.Writer
;
type
TDSpecFile = class
private
FLogger: ILogger;
FReader: IPackageSpecReader;
FFilename : string;
FLoadedSpec : IPackageSpec;
public
spec : IPackageSpec;
procedure DeleteTemplate(const templateName: string);
function DuplicateTemplate(const sourceTemplate: ISpecTemplate; const newTemplateName: string): ISpecTemplate;
function DoesTemplateExist(const templateName: string): Boolean;
function GetTemplate(const templateName: string): ISpecTemplate;
function GetPlatform(const compiler: string): ISpecTargetPlatform;
function AddCompiler(const compiler: string): ISpecTargetPlatform;
procedure DeleteCompiler(const compiler: string);
procedure LoadFromFile(const filename: string);
procedure SaveToFile(const filename: string);
function WorkingDir: string;
function IsModified: Boolean;
function AsString: string;
constructor Create(logger: ILogger);
destructor Destroy; override;
end;
implementation
uses
System.IOUtils,
System.Classes,
System.SysUtils,
System.JSON.Writers,
REST.Json,
DPM.Core.Spec,
DPM.Core.Spec.Template,
DPM.Core.Spec.TargetPlatform,
DPM.Core.Types
;
{ TDSpecFile }
function TDSpecFile.AddCompiler(const compiler: string): ISpecTargetPlatform;
var
vplatform : ISpecTargetPlatform;
begin
if Assigned(GetPlatform(compiler)) then
raise Exception.Create('Platform already exists in file');
vplatform := TSpecTargetPlatform.Create(FLogger);
vplatform.Compiler := StringToCompilerVersion(compiler);
spec.TargetPlatforms.Add(vplatform);
end;
function TDSpecFile.AsString: string;
begin
Result := spec.ToJSON;
end;
constructor TDSpecFile.Create(logger: ILogger);
begin
FLogger := logger;
spec := TSpec.Create(FLogger, '');
FLoadedSpec := TSpec.Create(FLogger, '');
end;
procedure TDSpecFile.DeleteTemplate(const templateName: string);
begin
spec.DeleteTemplate(templateName);
end;
procedure TDSpecFile.DeleteCompiler(const compiler: string);
var
i : Integer;
begin
for i := 0 to spec.TargetPlatforms.Count - 1 do
begin
if SameText(CompilerToString(spec.TargetPlatforms[i].compiler), compiler) then
begin
spec.TargetPlatforms.Delete(i);
Exit;
end;
end;
end;
destructor TDSpecFile.Destroy;
begin
inherited;
end;
function TDSpecFile.DoesTemplateExist(const templateName: string): Boolean;
begin
Result := Assigned(spec.FindTemplate(templateName));
end;
function TDSpecFile.DuplicateTemplate(const sourceTemplate: ISpecTemplate; const newTemplateName: string): ISpecTemplate;
begin
Result := spec.DuplicateTemplate(sourceTemplate, NewTemplateName);
end;
function TDSpecFile.GetTemplate(const templateName: string): ISpecTemplate;
var
i : Integer;
begin
Result := nil;
for i := 0 to spec.templates.Count - 1 do
begin
if spec.templates[i].name = templateName then
begin
Result := spec.templates[i];
Exit;
end;
end;
end;
function TDSpecFile.GetPlatform(const compiler: string): ISpecTargetPlatform;
var
i: Integer;
begin
Result := nil;
for i := 0 to spec.targetPlatforms.Count - 1 do
begin
if spec.targetPlatforms[i].compiler = StringToCompilerVersion(compiler) then
begin
Result := spec.targetPlatforms[i];
Exit;
end;
end;
end;
function TDSpecFile.IsModified: Boolean;
begin
Result := not SameText(spec.ToJSON, FLoadedSpec.ToJSON);
end;
procedure TDSpecFile.LoadFromFile(const filename: string);
begin
FReader := TPackageSpecReader.Create(FLogger);
spec := FReader.ReadSpec(filename);
FLoadedSpec := FReader.ReadSpec(filename);
FFilename := Filename;
end;
procedure TDSpecFile.SaveToFile(const filename: string);
var
writer : TPackageSpecWriter;
begin
writer := TPackageSpecWriter.Create(FLogger, spec);
writer.SaveToFile(filename);
end;
function TDSpecFile.WorkingDir: string;
begin
Result := TPath.GetDirectoryName(FFilename);
end;
end.