some more refactor
This commit is contained in:
parent
cdaf94e3cd
commit
d30e6ed759
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
constexpr std::string_view downloads("downloads");
|
constexpr std::string_view downloads("downloads");
|
||||||
|
|
||||||
|
static const std::regex remote("(^https?):\\/\\/");
|
||||||
|
|
||||||
Collection::Collection(
|
Collection::Collection(
|
||||||
const std::filesystem::path& destination,
|
const std::filesystem::path& destination,
|
||||||
const std::string& target,
|
const std::string& target,
|
||||||
@ -71,6 +73,10 @@ void Collection::sourceBuilt(const std::string& source, TaskManager::Error err)
|
|||||||
successSources.emplace(source);
|
successSources.emplace(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Collection::isRemote(const std::string& source) {
|
||||||
|
return std::regex_search(source, remote);
|
||||||
|
}
|
||||||
|
|
||||||
void Collection::queueDownload(const std::string& source) {
|
void Collection::queueDownload(const std::string& source) {
|
||||||
std::pair<Downloads::iterator, bool> res = downloadingSources.emplace(std::piecewise_construct,
|
std::pair<Downloads::iterator, bool> res = downloadingSources.emplace(std::piecewise_construct,
|
||||||
std::forward_as_tuple(source),
|
std::forward_as_tuple(source),
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
#include <regex>
|
||||||
|
|
||||||
#include "loggable.h"
|
#include "loggable.h"
|
||||||
#include "component.h"
|
#include "component.h"
|
||||||
@ -16,11 +17,8 @@ class Collection : protected Loggable {
|
|||||||
using Sources = std::set<std::string>;
|
using Sources = std::set<std::string>;
|
||||||
using Downloads = std::map<std::string, std::unique_ptr<Download>>;
|
using Downloads = std::map<std::string, std::unique_ptr<Download>>;
|
||||||
using Components = std::map<std::string, std::unique_ptr<Component>>;
|
using Components = std::map<std::string, std::unique_ptr<Component>>;
|
||||||
public:
|
|
||||||
class UnknownSource;
|
|
||||||
class DuplicateSource;
|
|
||||||
class DuplicatePath;
|
|
||||||
|
|
||||||
|
public:
|
||||||
Collection(
|
Collection(
|
||||||
const std::filesystem::path& destination,
|
const std::filesystem::path& destination,
|
||||||
const std::string& target,
|
const std::string& target,
|
||||||
@ -41,7 +39,7 @@ private:
|
|||||||
void sourceRead(const std::string& source, TaskManager::Error err);
|
void sourceRead(const std::string& source, TaskManager::Error err);
|
||||||
void sourceBuilt(const std::string& source, TaskManager::Error err);
|
void sourceBuilt(const std::string& source, TaskManager::Error err);
|
||||||
|
|
||||||
bool isRemote(const std::string& source);
|
static bool isRemote(const std::string& source);
|
||||||
|
|
||||||
void queueDownload(const std::string& source);
|
void queueDownload(const std::string& source);
|
||||||
void queueRead(const std::string& source, const std::filesystem::path& location);
|
void queueRead(const std::string& source, const std::filesystem::path& location);
|
||||||
@ -56,18 +54,3 @@ private:
|
|||||||
Components readingSources;
|
Components readingSources;
|
||||||
Components buildingSources;
|
Components buildingSources;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Collection::UnknownSource : public std::runtime_error {
|
|
||||||
public:
|
|
||||||
explicit UnknownSource(const std::string& source);
|
|
||||||
};
|
|
||||||
|
|
||||||
class Collection::DuplicateSource : public std::runtime_error {
|
|
||||||
public:
|
|
||||||
explicit DuplicateSource(const std::string& source);
|
|
||||||
};
|
|
||||||
|
|
||||||
class Collection::DuplicatePath : public std::runtime_error {
|
|
||||||
public:
|
|
||||||
explicit DuplicatePath(const std::string& source, const std::filesystem::path& path);
|
|
||||||
};
|
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
#include "component.h"
|
#include "component.h"
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <string_view>
|
|
||||||
|
|
||||||
#include "collection.h"
|
#include "collection.h"
|
||||||
|
|
||||||
|
constexpr std::string_view masonJSON("mason.json");
|
||||||
|
constexpr std::string_view dependencies("dependencies");
|
||||||
constexpr std::array<std::string_view, Component::done + 1> stringStates {
|
constexpr std::array<std::string_view, Component::done + 1> stringStates {
|
||||||
"initial",
|
"initial",
|
||||||
"reading",
|
"reading",
|
||||||
@ -20,21 +19,102 @@ Component::Component(
|
|||||||
const std::shared_ptr<Logger>& logger
|
const std::shared_ptr<Logger>& logger
|
||||||
):
|
):
|
||||||
Loggable(logger),
|
Loggable(logger),
|
||||||
|
state(initial),
|
||||||
|
type(unknown),
|
||||||
collection(collection),
|
collection(collection),
|
||||||
location(path)
|
location(path),
|
||||||
|
scenario(std::nullopt)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void Component::read() {
|
void Component::read() {
|
||||||
if (state != initial)
|
if (state != initial)
|
||||||
throw WrongState(state, "read");
|
throw WrongState(state, "read");
|
||||||
|
|
||||||
// try {
|
|
||||||
// collection->addSource(location);
|
|
||||||
// } catch (const Collection::DuplicateSource e) {
|
|
||||||
// state = error;
|
|
||||||
// throw e;
|
|
||||||
// }
|
|
||||||
state = reading;
|
state = reading;
|
||||||
|
|
||||||
|
std::filesystem::file_status status = std::filesystem::status(location);
|
||||||
|
switch (status.type()) {
|
||||||
|
case std::filesystem::file_type::directory:
|
||||||
|
type = directory;
|
||||||
|
state = ready;
|
||||||
|
tryReadingBuildScenarios();
|
||||||
|
break;
|
||||||
|
case std::filesystem::file_type::regular:
|
||||||
|
type = file;
|
||||||
|
state = ready;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
warn(location.string() + " doesn't appear to be a file nor a directory");
|
||||||
|
state = error;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Component::tryReadingBuildScenarios() {
|
||||||
|
if (readAsMason())
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Component::readAsMason() {
|
||||||
|
std::filesystem::path masonScenarion = location/masonJSON;
|
||||||
|
try {
|
||||||
|
std::ifstream file(masonScenarion);
|
||||||
|
if (file.is_open())
|
||||||
|
scenario = nlohmann::json::parse(file);
|
||||||
|
else
|
||||||
|
minor("Couldn't open " + masonScenarion.string());
|
||||||
|
} catch (const nlohmann::json::exception& e) {
|
||||||
|
major("Couldn't parse " + masonScenarion.string());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scenario.has_value()) {
|
||||||
|
const nlohmann::json& sc = scenario.value();
|
||||||
|
if (!sc.is_object())
|
||||||
|
return errorScenario(masonScenarion.string() + " is unexpected root type");
|
||||||
|
|
||||||
|
nlohmann::json::const_iterator itr = sc.find(dependencies);
|
||||||
|
if (itr == sc.end()) {
|
||||||
|
info(masonScenarion.string() + " doesn't have dependencies");
|
||||||
|
} else {
|
||||||
|
const nlohmann::json& deps = *itr;
|
||||||
|
if (!deps.is_array())
|
||||||
|
return errorScenario(masonScenarion.string() + " dependencies are not organized as an array");
|
||||||
|
|
||||||
|
for (const nlohmann::json& dep : deps) {
|
||||||
|
switch (dep.type()) {
|
||||||
|
case nlohmann::json::value_t::string:
|
||||||
|
collection->addSource(dep);
|
||||||
|
break;
|
||||||
|
case nlohmann::json::value_t::object: {
|
||||||
|
nlohmann::json::const_iterator ditr = dep.find("path");
|
||||||
|
if (ditr == dep.end())
|
||||||
|
return errorScenario(masonScenarion.string() + " object of unexpected format in dependecies");
|
||||||
|
|
||||||
|
nlohmann::json path = *ditr;
|
||||||
|
if (!path.is_string())
|
||||||
|
return errorScenario(masonScenarion.string() + " object of unexpected format in dependecies");
|
||||||
|
|
||||||
|
collection->addSource(path);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return errorScenario(masonScenarion.string() + " has unexpected entries in dependecies");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type = mason;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Component::errorScenario(const std::string& message) {
|
||||||
|
major(message);
|
||||||
|
scenario = std::nullopt;
|
||||||
|
return false;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Component::build(const std::filesystem::path& destination, const std::string& target) {
|
void Component::build(const std::filesystem::path& destination, const std::string& target) {
|
||||||
|
@ -2,9 +2,14 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <fstream>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
#include <optional>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <array>
|
||||||
|
#include <string_view>
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
#include "loggable.h"
|
#include "loggable.h"
|
||||||
#include "loggger.h"
|
#include "loggger.h"
|
||||||
@ -42,11 +47,17 @@ public:
|
|||||||
void read();
|
void read();
|
||||||
void build(const std::filesystem::path& destination, const std::string& target);
|
void build(const std::filesystem::path& destination, const std::string& target);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void tryReadingBuildScenarios();
|
||||||
|
bool readAsMason();
|
||||||
|
bool errorScenario(const std::string& message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
State state;
|
State state;
|
||||||
Type type;
|
Type type;
|
||||||
std::shared_ptr<Collection> collection;
|
std::shared_ptr<Collection> collection;
|
||||||
std::filesystem::path location;
|
std::filesystem::path location;
|
||||||
|
std::optional<nlohmann::json> scenario;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Component::WrongState : public std::runtime_error {
|
class Component::WrongState : public std::runtime_error {
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#include "download.h"
|
#include "download.h"
|
||||||
|
|
||||||
#include <regex>
|
|
||||||
|
|
||||||
constexpr std::string_view archived("archived");
|
constexpr std::string_view archived("archived");
|
||||||
constexpr std::string_view headerAcceptJson("accept: application/json");
|
constexpr std::string_view headerAcceptJson("accept: application/json");
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
#include <regex>
|
||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
Loading…
Reference in New Issue
Block a user