Vaguely working

This commit is contained in:
Your Name 2025-05-04 20:34:46 +12:00
parent 8d2a66ee49
commit 3bfd6a3cba
3 changed files with 43 additions and 19 deletions

View File

@ -155,6 +155,9 @@ int main(int argc, char* argv[]) {
if (!gConfig().is_config_set()) if (!gConfig().is_config_set())
return die("Please run 'dropshell edit' to set up the dropshell configuration."); return die("Please run 'dropshell edit' to set up the dropshell configuration.");
// load the template sources.
gTemplateManager().load_sources();
const std::vector<std::string> & server_definition_paths = gConfig().get_local_server_definition_paths(); const std::vector<std::string> & server_definition_paths = gConfig().get_local_server_definition_paths();
if (server_definition_paths.size()>1) { // only show if there are multiple. if (server_definition_paths.size()>1) { // only show if there are multiple.
std::cout << "Server definition paths: "; std::cout << "Server definition paths: ";

View File

@ -55,7 +55,7 @@
); );
} }
void template_manager::list_templates() { void template_manager::list_templates() const {
auto templates = get_template_list(); auto templates = get_template_list();
if (templates.empty()) { if (templates.empty()) {
@ -76,7 +76,7 @@
std::cout << std::string(60, '-') << std::endl; std::cout << std::string(60, '-') << std::endl;
} }
std::set<std::string> template_manager::get_template_list() std::set<std::string> template_manager::get_template_list() const
{ {
std::set<std::string> templates; std::set<std::string> templates;
for (const auto& source : mSources) { for (const auto& source : mSources) {
@ -86,7 +86,7 @@
return templates; return templates;
} }
bool template_manager::has_template(const std::string &template_name) bool template_manager::has_template(const std::string &template_name) const
{ {
template_source_interface* source = get_source(template_name); template_source_interface* source = get_source(template_name);
if (!source) if (!source)
@ -94,7 +94,7 @@
return true; return true;
} }
template_info template_manager::get_template_info(const std::string &template_name) template_info template_manager::get_template_info(const std::string &template_name) const
{ {
template_source_interface* source = get_source(template_name); template_source_interface* source = get_source(template_name);
if (!source) { if (!source) {
@ -103,12 +103,17 @@
return source->get_template_info(template_name); return source->get_template_info(template_name);
} }
bool template_manager::template_command_exists(const std::string &template_name, const std::string &command) bool template_manager::template_command_exists(const std::string &template_name, const std::string &command) const
{ {
template_source_interface* source = get_source(template_name);
if (!source) {
std::cerr << "Error: Template '" << template_name << "' not found" << std::endl;
return false; return false;
} }
return source->template_command_exists(template_name, command);
}
void template_manager::create_template(const std::string &template_name) void template_manager::create_template(const std::string &template_name) const
{ {
// 1. Create a new directory in the user templates directory // 1. Create a new directory in the user templates directory
std::vector<std::string> local_server_definition_paths = gConfig().get_local_server_definition_paths(); std::vector<std::string> local_server_definition_paths = gConfig().get_local_server_definition_paths();
@ -192,6 +197,8 @@
void template_manager::load_sources() void template_manager::load_sources()
{ {
ASSERT(mSources.empty()); ASSERT(mSources.empty());
ASSERT(gConfig().is_config_set());
ASSERT(!mLoaded);
auto local_template_paths = gConfig().get_template_local_paths(); auto local_template_paths = gConfig().get_template_local_paths();
if (local_template_paths.empty()) { if (local_template_paths.empty()) {
std::cerr << "Error: No local template paths found" << std::endl; std::cerr << "Error: No local template paths found" << std::endl;
@ -206,6 +213,13 @@
for (const auto& url : registry_urls) { for (const auto& url : registry_urls) {
mSources.push_back(std::make_unique<template_source_registry>(url)); mSources.push_back(std::make_unique<template_source_registry>(url));
} }
std::cout << "Loaded " << mSources.size() << " template sources:" << std::endl;
for (const auto& source : mSources) {
std::cout << source->get_description() << std::endl;
}
mLoaded = true;
} }
bool template_manager::required_file(std::string path, std::string template_name) bool template_manager::required_file(std::string path, std::string template_name)
@ -217,7 +231,7 @@
return true; return true;
} }
template_source_interface *template_manager::get_source(const std::string &template_name) template_source_interface *template_manager::get_source(const std::string &template_name) const
{ {
for (const auto& source : mSources) { for (const auto& source : mSources) {
if (source->has_template(template_name)) { if (source->has_template(template_name)) {

View File

@ -37,6 +37,8 @@ class template_source_interface {
virtual bool has_template(const std::string& template_name) = 0; virtual bool has_template(const std::string& template_name) = 0;
virtual template_info get_template_info(const std::string& template_name) = 0; virtual template_info get_template_info(const std::string& template_name) = 0;
virtual bool template_command_exists(const std::string& template_name,const std::string& command) = 0; virtual bool template_command_exists(const std::string& template_name,const std::string& command) = 0;
virtual std::string get_description() = 0;
}; };
class template_source_registry : public template_source_interface { class template_source_registry : public template_source_interface {
@ -49,6 +51,8 @@ class template_source_registry : public template_source_interface {
bool has_template(const std::string& template_name); bool has_template(const std::string& template_name);
template_info get_template_info(const std::string& template_name); template_info get_template_info(const std::string& template_name);
bool template_command_exists(const std::string& template_name,const std::string& command); bool template_command_exists(const std::string& template_name,const std::string& command);
std::string get_description() { return "Registry: " + mURL; }
private: private:
std::filesystem::path get_cache_dir(); std::filesystem::path get_cache_dir();
private: private:
@ -64,6 +68,8 @@ class template_source_local : public template_source_interface {
bool has_template(const std::string& template_name); bool has_template(const std::string& template_name);
template_info get_template_info(const std::string& template_name); template_info get_template_info(const std::string& template_name);
bool template_command_exists(const std::string& template_name,const std::string& command); bool template_command_exists(const std::string& template_name,const std::string& command);
std::string get_description() { return "Local: " + mLocalPath.string(); }
private: private:
std::filesystem::path mLocalPath; std::filesystem::path mLocalPath;
}; };
@ -73,24 +79,25 @@ class template_manager {
template_manager() : mLoaded(false) {} template_manager() : mLoaded(false) {}
~template_manager() {} ~template_manager() {}
std::set<std::string> get_template_list(); std::set<std::string> get_template_list() const;
bool has_template(const std::string& template_name); bool has_template(const std::string& template_name) const;
template_info get_template_info(const std::string& template_name); template_info get_template_info(const std::string& template_name) const;
bool template_command_exists(const std::string& template_name,const std::string& command); bool template_command_exists(const std::string& template_name,const std::string& command) const;
void create_template(const std::string& template_name); void create_template(const std::string& template_name) const;
bool test_template(const std::string& template_path); static bool test_template(const std::string& template_path);
void list_templates(); void list_templates() const;
void load_sources();
private: private:
void load_sources(); static bool required_file(std::string path, std::string template_name);
bool required_file(std::string path, std::string template_name); template_source_interface* get_source(const std::string& template_name) const;
template_source_interface* get_source(const std::string& template_name);
private: private:
bool mLoaded; bool mLoaded;
std::vector<std::unique_ptr<template_source_interface>> mSources; mutable std::vector<std::unique_ptr<template_source_interface>> mSources;
}; };
template_manager & gTemplateManager(); template_manager & gTemplateManager();