vipak/vpkDependencyResolver.Mod
2020-04-02 23:20:19 +04:00

116 lines
4 KiB
Modula-2

MODULE vpkDependencyResolver;
IMPORT vpkJsonParser, vpkSettings, vpkPackageResolver, Strings, vpkLogger;
CONST ArrayMaxNumber = 30;
VAR
moduleNames: ARRAY ArrayMaxNumber OF vpkJsonParser.TString;
moduleJson: ARRAY ArrayMaxNumber OF vpkJsonParser.TString;
moduleVersions: ARRAY ArrayMaxNumber OF vpkJsonParser.TString;
j : LONGINT;
PROCEDURE ResolveVersionFiles *(jsonString: ARRAY OF CHAR);
VAR
jsonRecord, dependencies: vpkJsonParser.JsonTypePointer;
keyFound: BOOLEAN;
packageName, version, filePath: ARRAY 32 OF CHAR;
returnedJSON: vpkJsonParser.TString;
keys: ARRAY ArrayMaxNumber OF vpkJsonParser.TString;
i, k : LONGINT;
BEGIN
jsonRecord := vpkJsonParser.Create(jsonString);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Package", packageName);
IF keyFound THEN
vpkLogger.Log("Parsing package by name");
vpkLogger.Log(packageName);
vpkLogger.Log("------------------------");
ELSE vpkLogger.Log("Value for the Key is not found"); RETURN; END;
dependencies := jsonRecord.GetNonTerminal(jsonRecord, "Dependencies");
IF dependencies = NIL THEN
vpkLogger.Log("Parsing package by name");
vpkLogger.Log(packageName);
vpkLogger.Log("Error");
vpkLogger.Log("No dependency");
vpkLogger.Log("------------------------");
END;
dependencies.GetTerminalKeys(dependencies, keys);
FOR i := 0 TO dependencies.TerminalNumber - 1 DO (* TODO: rewrite with working getter everywhere*)
keyFound := dependencies.GetTerminal(dependencies, keys[i], version);
IF ~keyFound THEN vpkLogger.Log('ERROR while searching key'); vpkLogger.Log(keys[i]); END;
ASSERT(keyFound);
COPY("", filePath);
Strings.Append("/", filePath);
Strings.Append(keys[i], filePath);
Strings.Append("/", filePath);
Strings.Append(version, filePath);
Strings.Append("/", filePath);
Strings.Append(vpkSettings.packageFileName, filePath);
vpkJsonParser.Empty(returnedJSON);
vpkPackageResolver.ResolveFile(
vpkSettings.host,
vpkSettings.port,
filePath,
keys[i],
vpkSettings.packageFileName,
returnedJSON
);
keyFound := FALSE;
IF j >= LEN(moduleNames) THEN
vpkLogger.Log("Out of range in ResolveVersionFiles function in ...");
END;
ASSERT(j < LEN(moduleNames));
FOR k := 0 TO j - 1 DO
IF Strings.Match(moduleNames[k], keys[i]) THEN
keyFound := TRUE;
END;
END;
IF ~keyFound THEN
COPY(keys[i], moduleNames[j]);
COPY(version, moduleVersions[j]);
COPY(returnedJSON, moduleJson[j]);
INC(j);
ResolveVersionFiles(returnedJSON);
END;
END;
END ResolveVersionFiles;
PROCEDURE ResolvePackages*();
VAR
i: LONGINT;
keyFound: BOOLEAN;
jsonRecord, filesRecord: vpkJsonParser.JsonTypePointer;
values: ARRAY 10 OF vpkJsonParser.TString;
host, port, path, packageName, version: ARRAY 50 OF CHAR;
BEGIN
FOR i := 0 TO j - 1 DO
jsonRecord := vpkJsonParser.Create(moduleJson[i]);
filesRecord := jsonRecord.GetNonTerminal(jsonRecord, "Files");
IF filesRecord = NIL THEN
vpkLogger.Log("Error: no files section found");
END;
ASSERT(filesRecord # NIL);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Remote", host);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Port", port);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Path", path);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Package", packageName);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Version", version);
vpkPackageResolver.Resolve(host, port, path, packageName, version, filesRecord.TerminalValues); (* TODO: filesRecord.TerminalValues create working getter for this*)
END;
END ResolvePackages;
END vpkDependencyResolver.