summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commands.cpp38
-rw-r--r--music.cpp7
2 files changed, 38 insertions, 7 deletions
diff --git a/commands.cpp b/commands.cpp
index dfeeebb..2401690 100644
--- a/commands.cpp
+++ b/commands.cpp
@@ -2,6 +2,8 @@
#include "music.h"
#include <boost/cast.hpp>
+#include <boost/format.hpp>
+#include <boost/algorithm/string/join.hpp>
#include <iostream>
@@ -28,10 +30,46 @@ static std::vector<std::string> ls(const std::vector<std::string>& args) {
return result;
}
+typedef boost::function<std::vector<MusicListing::p> (const std::string artist)> FindFunction;
+std::map<std::string, FindFunction> find_handlers;
+
+static std::vector<std::string> find(const std::vector<std::string>& args) {
+ if(args.size() != 3) {
+ throw commands::CommandException("usage: find TYPE SEARCH");
+ }
+
+ FindFunction ff;
+ if(find_handlers.find(args[1]) != find_handlers.end()) {
+ ff = find_handlers[args[1]];
+ } else {
+ std::vector<std::string> types;
+ for(std::map<std::string, FindFunction>::iterator it = find_handlers.begin(); it != find_handlers.end(); it++) {
+ types.push_back(it->first);
+ }
+ std::string s = boost::str(boost::format("unknown search type, must be one of %s") % boost::algorithm::join(types, ", "));
+ throw commands::CommandException(s.c_str());
+ }
+
+ std::vector<MusicListing::p> ml = ff(args[2]);
+ if(!ml.size()) {
+ throw commands::CommandException("no results");
+ }
+
+ std::vector<std::string> result;
+ for(std::vector<MusicListing::p>::iterator it = ml.begin(); it != ml.end(); it++) {
+ result.push_back((*it)->path.string());
+ }
+
+
+ return result;
+}
+
std::map<std::string, commands::Handler> commands::handlers;
void commands::init() {
handlers["ls"] = ls;
+ handlers["find"] = find;
+ find_handlers["artist"] = music::find_artist;
}
std::vector<std::string> commands::execute(const std::vector<std::string>& args) {
diff --git a/music.cpp b/music.cpp
index 295f5e4..772ae9c 100644
--- a/music.cpp
+++ b/music.cpp
@@ -19,12 +19,6 @@ void music::init(std::string root) {
if(boost::algorithm::ends_with(root, "/"))
root = root.substr(0, root.size()-1);
root_directory = root;
-
- // find_artist test
- std::vector<MusicListing::p> ml = find_artist("a");
- for(std::vector<MusicListing::p>::iterator it = ml.begin(); it != ml.end(); it++) {
- std::cout << "result: " << (*it)->path << std::endl;
- }
}
MusicListing::p music::get(const std::vector<std::string>& path) {
@@ -68,7 +62,6 @@ std::vector<MusicListing::p> music::find_artist(const std::string artist) {
boost::shared_ptr<MusicListing> ml(new MusicTrack(*it));
results.push_back(ml);
}
- std::cout << "results size: " << results.size() << std::endl;
return results;
}