You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.3 KiB

#ifndef _BT_HELPERS_HPP_
#define _BT_HELPERS_HPP_
#include <unordered_map>
#include <boost/regex.hpp>
#include <json.hpp>
namespace util {
class uri {
public:
auto static parse(const std::string &request_path){
std::unordered_map<std::string,std::string> options;
std::string option, value;
bool collect=false;
for(auto &c:request_path){
switch(c){
case '&':
options.insert(std::make_pair(option,value));
option="";
collect=true;
break;
case '?':
collect=true;
break;
case '=':
collect=false;
value="";
break;
default:
if(collect)
option+=c;
else
value+=c;
break;
}
}
if(!option.empty() || !value.empty())
options.insert(std::make_pair(option,value));
return options;
}
};
const boost::regex regex("@(https?|ftp)://(-\\.)?([^\\s/?\\.#-]+\\.?)+(/[^\\s]*)?$@", boost::regex_constants::perl | boost::regex_constants::icase);
class json {
public:
/*! @brief Wrapper for nlohmann::json::parse. If the parse fails, result.is_null() will be */
static nlohmann::json parse(std::istream &istream) {
try {
return nlohmann::json::parse(istream);
} catch(const std::invalid_argument &exp) {
}
return nlohmann::json(nullptr);
}
/*! @brief wrapper around nlohmann::json::parse, but object returns null on throw */
static nlohmann::json parse(const std::string &string){
try {
return nlohmann::json::parse(string);
} catch(const std::invalid_argument &exp) {
}
return nlohmann::json(nullptr);
}
static bool has_property(const std::string &key, const nlohmann::json &object){
auto it=object.find(key);
return it!=object.end();
}
template<class T>
static auto get(const std::string &key, const nlohmann::json &object, const T &default_value){
if(has_property(key,object)){
T r;
try{
r=object[key]; //TODO fix use json parser where a non-throwable exist
} catch(const std::exception&){
return default_value;
}
return r;
}
return default_value;
}
};
}
#endif // _BT_HELPERS_HPP_