aboutsummaryrefslogtreecommitdiff
path: root/src/Package.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Package.cpp')
-rw-r--r--src/Package.cpp65
1 files changed, 39 insertions, 26 deletions
diff --git a/src/Package.cpp b/src/Package.cpp
index eab0680..925de82 100644
--- a/src/Package.cpp
+++ b/src/Package.cpp
@@ -1,5 +1,6 @@
#include "../include/Package.hpp"
#include "../include/curl.hpp"
+#include "../include/VersionParser.hpp"
#include "../external/rapidjson/error/en.h"
#ifdef GetObject
@@ -37,7 +38,15 @@ namespace sibs
PackageMetadata packageMetadata;
packageMetadata.description.assign(description->value.GetString(), description->value.GetStringLength());
- packageMetadata.version.assign(version->value.GetString(), version->value.GetStringLength());
+
+ int versionStrSize = 0;
+ Result<PackageVersion> versionResult = parsePackageVersion({ version->value.GetString(), version->value.GetStringLength() }, &versionStrSize);
+ if(!versionResult)
+ return Result<PackageMetadata>::Err("package version is in wrong fromat, error: " + versionResult.getErrMsg());
+ if(versionStrSize != (int)version->value.GetStringLength())
+ return Result<PackageMetadata>::Err("package version is in wrong format, expected only numbers and dots (version: " + string(version->value.GetString(), version->value.GetStringLength()) + ")");
+
+ packageMetadata.version = versionResult.unwrap();
const auto &platformsArray = platforms->value.GetArray();
packageMetadata.platforms.reserve(platformsArray.Size());
@@ -50,6 +59,9 @@ namespace sibs
}
const auto &urlsArray = urls->value.GetArray();
+ if(urlsArray.Empty())
+ return Result<PackageMetadata>::Err("Expected url list to not be empty");
+
packageMetadata.urls.reserve(urlsArray.Size());
for(int i = 0; i < urlsArray.Size(); ++i)
{
@@ -62,16 +74,16 @@ namespace sibs
return Result<PackageMetadata>::Ok(packageMetadata);
}
- static Result<string> getPackageUrl(const PackageMetadata &packageMetadata, const char *packageName, const char *packageVersion, Platform platform)
+ static Result<bool> isPackageUsableForPlatform(const PackageMetadata &packageMetadata, const char *packageName, const PackageVersionRange &versionRange, Platform platform)
{
- if(strcmp(packageMetadata.version.c_str(), packageVersion) != 0)
+ if(!versionRange.isInRange(packageMetadata.version))
{
string errMsg = "Package \"";
errMsg += packageName;
- errMsg += "\" does not exist for version \"";
- errMsg += packageVersion;
+ errMsg += "\" does not exist for version range \"";
+ errMsg += versionRange.toString();
errMsg += "\"";
- return Result<string>::Err(errMsg);
+ return Result<bool>::Err(errMsg);
}
if(!containsPlatform(getPlatformsByNames(packageMetadata.platforms), platform))
@@ -79,14 +91,14 @@ namespace sibs
string errMsg = "Package \"";
errMsg += packageName;
errMsg += "\" with version \"";
- errMsg += packageVersion;
+ errMsg += packageMetadata.version.toString();
errMsg += "\" does not support platform \"";
errMsg += platform;
errMsg += "\"";
- return Result<string>::Err(errMsg);
+ return Result<bool>::Err(errMsg);
}
-
- return Result<string>::Ok(packageMetadata.urls[0]);
+
+ return Result<bool>::Ok(true);
}
// TODO: Always downloading is fine right now because the package list is small. This should later be modified to use local cache.
@@ -120,11 +132,11 @@ namespace sibs
return Result<Document*>::Ok(packageList);
}
- Result<string> Package::getPackageUrl(const char *packageName, const char *packageVersion, Platform platform)
+ Result<PackageMetadata> Package::getPackage(const char *packageName, const PackageVersionRange &versionRange, Platform platform)
{
Result<Document*> packageList = Package::getPackageList("https://gitlab.com/DEC05EBA/sibs_packages/raw/master/packages.json");
if(!packageList)
- return Result<string>::Err(packageList);
+ return Result<PackageMetadata>::Err(packageList);
const Document &packageDoc = *packageList.unwrap();
@@ -134,14 +146,18 @@ namespace sibs
string errMsg = "No package with the name \"";
errMsg += packageName;
errMsg += "\" was found";
- return Result<string>::Err(errMsg);
+ return Result<PackageMetadata>::Err(errMsg);
}
if(packageMetaDataJsonIt->value.IsObject())
{
Result<PackageMetadata> packageMetadataResult = getPackageMetadata(packageMetaDataJsonIt->value.GetObject());
- if(!packageMetadataResult) return Result<string>::Err(packageMetadataResult);
- return ::sibs::getPackageUrl(packageMetadataResult.unwrap(), packageName, packageVersion, platform);
+ if(!packageMetadataResult) return packageMetadataResult;
+ Result<bool> packageUsableResult = isPackageUsableForPlatform(packageMetadataResult.unwrap(), packageName, versionRange, platform);
+ if(packageUsableResult)
+ return Result<PackageMetadata>::Ok(packageMetadataResult.unwrap());
+ else
+ return Result<PackageMetadata>::Err(packageUsableResult);
}
else if(packageMetaDataJsonIt->value.IsArray())
{
@@ -155,35 +171,32 @@ namespace sibs
errMsg += "[";
errMsg += to_string(i);
errMsg += "] is not an object";
- return Result<string>::Err(errMsg);
+ return Result<PackageMetadata>::Err(errMsg);
}
Result<PackageMetadata> packageMetadataResult = getPackageMetadata(packageData.GetObject());
- if(packageMetadataResult)
- {
- Result<string> packageUrlResult = ::sibs::getPackageUrl(packageMetadataResult.unwrap(), packageName, packageVersion, platform);
- if(packageUrlResult)
- return packageUrlResult;
- }
+ if(!packageMetadataResult) return packageMetadataResult;
+ if(isPackageUsableForPlatform(packageMetadataResult.unwrap(), packageName, versionRange, platform))
+ return Result<PackageMetadata>::Ok(packageMetadataResult.unwrap());
++i;
}
string errMsg = "Package \"";
errMsg += packageName;
- errMsg += "\" with version \"";
- errMsg += packageVersion;
+ errMsg += "\" in version range \"";
+ errMsg += versionRange.toString();
errMsg += "\" does not exist or does not exist for platform \"";
errMsg += asString(platform);
errMsg += "\"";
- return Result<string>::Err(errMsg);
+ return Result<PackageMetadata>::Err(errMsg);
}
else
{
string errMsg = "No package with the name \"";
errMsg += packageName;
errMsg += "\" was found";
- return Result<string>::Err(errMsg);
+ return Result<PackageMetadata>::Err(errMsg);
}
}
}