#include "commands.h" #include #include #include #include std::vector Commands::ls() { if(args.size() != 2) { throw CommandException("usage: ls DIR"); } MusicDirectory::p dir = music::get_directory(args[1]); if(!dir) { throw CommandException("no such directory"); } std::cout << dir->path << std::endl; std::vector result; for(MusicDirectory::PathListings::iterator it = dir->directories.begin(); it != dir->directories.end(); it++) { std::string rel_path = it->string().substr(music::root_directory.string().size()); result.push_back(rel_path); } for(MusicDirectory::PathListings::iterator it = dir->tracks.begin(); it != dir->tracks.end(); it++) { std::string rel_path = it->string().substr(music::root_directory.string().size()); result.push_back(rel_path); } return result; } std::vector Commands::find() { if(args.size() != 3) { throw CommandException("usage: find TYPE SEARCH"); } FindFunction ff; if(find_handlers.find(args[1]) != find_handlers.end()) { ff = find_handlers[args[1]]; } else { std::vector types; for(std::map::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 CommandException(s.c_str()); } std::vector ml = ff(args[2]); if(!ml.size()) { throw CommandException("no results"); } std::vector result; for(std::vector::iterator it = ml.begin(); it != ml.end(); it++) { result.push_back((*it)->path.string()); } return result; } std::vector Commands::update() { if(args.size() != 2) { throw CommandException("usage: update DIR"); } io_service.post(boost::bind(music::begin_update, args[1])); std::vector v; return v; } Commands::Commands(boost::asio::io_service& io_service_, std::vector& args_) : io_service(io_service_), args(args_) { handlers["ls"] = &Commands::ls; handlers["find"] = &Commands::find; find_handlers["artist"] = music::find_artist; handlers["update"] = &Commands::update; } std::vector Commands::operator()() { assert(args.size()); Handler h = handlers[args[0]]; if(!h) { throw CommandException(boost::str(boost::format("unknown command \"%s\"") % args[0])); } return h(this); }