diff options
-rw-r--r-- | gentoobrowse-api/client/Jamfile.jam | 5 | ||||
-rw-r--r-- | gentoobrowse-api/client/main.cpp | 51 | ||||
-rw-r--r-- | gentoobrowse-api/client/main.h | 15 | ||||
-rw-r--r-- | gentoobrowse-api/client/search.cpp | 24 |
4 files changed, 76 insertions, 19 deletions
diff --git a/gentoobrowse-api/client/Jamfile.jam b/gentoobrowse-api/client/Jamfile.jam index 66165d9..7c3edaa 100644 --- a/gentoobrowse-api/client/Jamfile.jam +++ b/gentoobrowse-api/client/Jamfile.jam @@ -1,7 +1,12 @@ +lib boost_program_options ; + exe gbcli : [ glob *.cpp ] : <library>../domain//gentoobrowse-domain + <library>..//adhocutil + <library>..//boost_system + <library>boost_program_options <implicit-dependency>../domain//gentoobrowse-domain <library>../api//gentoobrowse-api <implicit-dependency>../api//gentoobrowse-api diff --git a/gentoobrowse-api/client/main.cpp b/gentoobrowse-api/client/main.cpp index 61c6575..d2f70bb 100644 --- a/gentoobrowse-api/client/main.cpp +++ b/gentoobrowse-api/client/main.cpp @@ -1,30 +1,43 @@ #include "stdio.h" +#include "main.h" #include <portage.h> +#include <plugins.impl.h> #include <Ice/Ice.h> +#include <boost/program_options.hpp> + +namespace po = boost::program_options; +INSTANTIATEPLUGINOF(Module); int main(int c, char ** v) { - auto ic = Ice::initialize(c, v); - auto p = Gentoo::PortagePrx::checkedCast(ic->stringToProxy("portage:tcp -h localhost -p 9001")); -#if 0 - for (int x = 1; x < c; x += 1) { - auto cat = p->getCategory(atoi(v[x])); - fprintf(stdout, "%d: %s\n", cat->categoryid, cat->name.c_str()); - if (cat->summary) { - fprintf(stdout, "\t%s\n", cat->summary->c_str()); - } - fprintf(stdout, "\n"); - } - auto ps = p->getPackagesSearch(v[1]); - for (const auto & p : ps) { - fprintf(stderr, "%d / %s\n\t%s\n", p->categoryid, p->name.c_str(), p->description.c_str()); - } -#endif - auto fp = p->findPackage(v[1], v[2]); - if (fp) { - fprintf(stderr, "%d / %s\n\t%s\n", (*fp)->categoryid, (*fp)->name.c_str(), (*fp)->description.c_str()); + std::string endpoint; + std::string module; + std::vector<std::string> args; + po::options_description opts("Gentoo Browse Client options"); + opts.add_options() + ("endpoint", po::value(&endpoint)->default_value("tcp -h gentoobrowse.randomdan.homeip.net -p 9001"), "Service endpoint") + ("module", po::value(&module), "Module") + ("args", po::value(&args), "Module options") + ("help,h", "Show help") + ; + po::positional_options_description pod; + pod.add("module", 1).add("args", -1); + po::variables_map vm; + po::store(po::command_line_parser(c, v).options(opts).positional(pod).run(), vm); + po::notify(vm); + + if (vm.count("help")) { + std::cerr << opts << std::endl; + exit(1); } + + auto ic = Ice::initialize(c, v); + auto p = Gentoo::PortagePrx::checkedCast(ic->stringToProxy("portage:" + endpoint)); + p->ice_ping(); + + AdHoc::PluginManager::getDefault()->get<Module>(module)->implementation()->run(p, args); + ic->destroy(); return 0; } diff --git a/gentoobrowse-api/client/main.h b/gentoobrowse-api/client/main.h new file mode 100644 index 0000000..9c7c9f7 --- /dev/null +++ b/gentoobrowse-api/client/main.h @@ -0,0 +1,15 @@ +#ifndef GENTOO_MAIN_H +#define GENTOO_MAIN_H + +#include <vector> +#include <string> +#include <plugins.h> +#include <portage.h> + +class Module : public AdHoc::AbstractPluginImplementation { + public: + virtual void run(Gentoo::PortagePrx, const std::vector<std::string> &) const = 0; +}; + +#endif + diff --git a/gentoobrowse-api/client/search.cpp b/gentoobrowse-api/client/search.cpp new file mode 100644 index 0000000..dd4baf1 --- /dev/null +++ b/gentoobrowse-api/client/search.cpp @@ -0,0 +1,24 @@ +#include <plugins.h> +#include <fprintbf.h> +#include <boost/algorithm/string/join.hpp> +#include "main.h" + +class search : public Module { + public: + void run(Gentoo::PortagePrx p, const std::vector<std::string> & a) const override + { + auto pkgs = p->getPackagesSearch(boost::algorithm::join(a, " ")); + std::map<int, Gentoo::CategoryPtr> cats; + fprintbf(stdout, "Found %d packages:\n", pkgs.size()); + for (const auto & pkg : pkgs) { + auto ci = cats.find(pkg->categoryid); + if (ci == cats.end()) { + ci = cats.insert({pkg->categoryid, p->getCategory(pkg->categoryid)}).first; + } + fprintbf(stdout, "%s / %s\n\t%s\n", ci->second->name, pkg->name, pkg->description); + } + } +}; + +PLUGIN(search, Module); + |