Redid fat_strings.cpp to be harder to mess up the json formatting

This commit is contained in:
rexy712 2019-12-08 11:08:19 -08:00
parent 7f4ffbf2ed
commit 913a9f6430
5 changed files with 161 additions and 131 deletions

View File

@ -28,7 +28,7 @@
#include "matrix/upload_info.hpp"
namespace matrix::json{
raii::string _empty(void);
raii::static_string _empty(void);
raii::string _image_body(const uploaded_image& image);
raii::string _video_body(const uploaded_video& video);

View File

@ -5,6 +5,10 @@
namespace matrix::json{
constexpr raii::static_string True(void){return "true"_ss;}
constexpr raii::static_string False(void){return "false"_ss;}
constexpr raii::static_string reason(void){return "reason"_ss;}
namespace message{
constexpr raii::static_string body(void){return "body"_ss;}
constexpr raii::static_string info(void){return "info"_ss;}
@ -31,10 +35,17 @@ namespace matrix::json{
constexpr raii::static_string identifier(void){return "identifier"_ss;}
constexpr raii::static_string password(void){return "password"_ss;}
constexpr raii::static_string newpassword(void){return "new_password"_ss;}
constexpr raii::static_string auth(void){return "auth"_ss;}
namespace authbody{
constexpr raii::static_string type(void){return auth::type();}
constexpr raii::static_string session(void){return "session"_ss;}
constexpr raii::static_string user(void){return "user"_ss;}
constexpr raii::static_string password(void){return auth::password();}
}
namespace identifierbody{
constexpr raii::static_string type(void){return auth::type();}
constexpr raii::static_string user(void){return "user"_ss;}
constexpr raii::static_string session(void){return "session"_ss;}
constexpr raii::static_string session(void){return auth::authbody::session();}
constexpr raii::static_string user(void){return auth::authbody::user();}
constexpr raii::static_string password(void){return auth::password();}
}
}
@ -43,14 +54,19 @@ namespace matrix::json{
constexpr raii::static_string joined(void){return "joined"_ss;}
constexpr raii::static_string eventid(void){return "event_id"_ss;}
constexpr raii::static_string chunk(void){return "chunk"_ss;}
constexpr raii::static_string newversion(void){return "new_version"_ss;}
}
namespace client{
constexpr raii::static_string presence(void){return "presence"_ss;}
constexpr raii::static_string dispname(void){return "displayname"_ss;}
constexpr raii::static_string displayname(void){return "displayname"_ss;}
constexpr raii::static_string avatarurl(void){return "avatar_url"_ss;}
constexpr raii::static_string roomid(void){return "room_id"_ss;}
constexpr raii::static_string joinedrooms(void){return "joined_rooms"_ss;}
constexpr raii::static_string contenturi(void){return "content_uri"_ss;}
constexpr raii::static_string name(void){return "name"_ss;}
constexpr raii::static_string roomaliasname(void){return "room_alias_name"_ss;}
constexpr raii::static_string typing(void){return "typing"_ss;}
constexpr raii::static_string timeout(void){return "timeout"_ss;}
}
namespace session{
constexpr raii::static_string session(void){return "session"_ss;}

View File

@ -23,6 +23,7 @@ OBJDIR::=obj
DEPDIR::=$(OBJDIR)/dep
LIBDIR::=lib
INCLUDE_DIRS::=include
EXTRA_WARNINGS:=-Wduplicated-branches -Wduplicated-cond -Wextra-semi -Wfloat-equal -Wlogical-op -Wnoexcept -Wnon-virtual-dtor -Wuseless-cast
CXXFLAGS::=-std=c++17 -Wall -pedantic -Wextra
EXT::=cpp
MAIN_LIBRARY::=rmatrix
@ -64,9 +65,9 @@ ifeq ($(RELEASE),1)
CXXFLAGS+=-O2 -Wno-strict-aliasing
else ifeq ($(MEMCHK),1)
LDFLAGS+=-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls
CXXFLAGS+=-O0 -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls
CXXFLAGS+=-O0 -g3 -ggdb -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls
else
CXXFLAGS+=-O0 -g
CXXFLAGS+=-O0 -g3 -ggdb
endif

View File

@ -49,7 +49,7 @@ namespace matrix{
//networked getter
netreturn<raii::rjp_string> client::get_display_name(void)const{
return _get_and_find(m_ses->urls.displayname(), json::client::dispname());
return _get_and_find(m_ses->urls.displayname(), json::client::displayname());
}
netreturn<raii::rjp_string> client::get_profile_picture(void)const{
return _get_and_find(m_ses->urls.profile_picture(), json::client::avatarurl());

View File

@ -23,20 +23,41 @@
#include "raii/util.hpp"
namespace matrix::json{
static constexpr decltype(auto) quote(const raii::string_base& str){
static constexpr auto quote(const raii::string_base& str){
return "\"" + str + "\"";
}
static constexpr decltype(auto) quotecomma(const raii::string_base& str){
return "\"" + str + "\",";
}
static constexpr decltype(auto) keyquote(const raii::string_base& str){
static constexpr auto key(const raii::string_base& str){
return "\"" + str + "\":";
}
raii::string _empty(void){
return raii::string("{}");
static constexpr raii::static_string open_brace(void){
return "{"_ss;
}
static constexpr raii::static_string close_brace(void){
return "}"_ss;
}
static constexpr raii::static_string comma(void){
return ","_ss;
}
template<class Arg, class... Args>
static constexpr auto object_impl(Arg&& arg, Args&&... args){
if constexpr(sizeof...(args) > 0){
return arg + comma() + object_impl(std::forward<Args>(args)...);
}else{
return std::forward<Arg>(arg);
}
}
template<class... Args>
static constexpr auto object(Args&&... args){
return open_brace() + object_impl(std::forward<Args>(args)...) + close_brace();
}
template<class Str1, class Str2>
static constexpr auto member(Str1&& k, Str2&& value){
return key(k) + value;
}
raii::static_string _empty(void){
return "{}"_ss;
}
raii::string _image_body(const uploaded_image& image){
raii::string url = raii::json_escape(image.url());
const raii::string_base* thumburl;
@ -45,173 +66,165 @@ namespace matrix::json{
else
thumburl = &url;
//compiler intensive
return raii::string(
"{"
"\"body\":\"" + raii::json_escape(image.name()) + "\","
"\"info\":{"
"\"h\":" + raii::itostr(image.height()) + ","
"\"mimetype\":\"" + image.mimetype() + "\","
"\"size\":" + raii::itostr(image.size()) + ","
"\"thumnail_info\":{"
"\"h\":" + raii::itostr(image.thumb_height()) + ","
"\"mimetype\":\"" + image.mimetype() + "\","
"\"size\":" + raii::itostr(image.thumb_size()) + ","
"\"w\":" + raii::itostr(image.thumb_width()) +
"},"
"\"thumbnail_url\":\"" + (*thumburl) + "\","
"\"w\":" + raii::itostr(image.width()) +
"},"
"\"msgtype\":\"m.image\","
"\"url\":\"" + url + "\""
"}");
object(
member(json::message::body(), quote(raii::json_escape(image.name()))),
member(json::message::info(), object(
member(json::message::infobody::height(), raii::itostr(image.height())),
member(json::message::infobody::mimetype(), quote(image.mimetype())),
member(json::message::infobody::size(), raii::itostr(image.size())),
member(json::message::infobody::thumbinfo(), object(
member(json::message::infobody::thumbnail::height(), raii::itostr(image.thumb_height())),
member(json::message::infobody::thumbnail::mimetype(), quote(image.thumb_mimetype())),
member(json::message::infobody::thumbnail::size(), raii::itostr(image.thumb_size())),
member(json::message::infobody::thumbnail::width(), raii::itostr(image.thumb_width()))
)),
member(json::message::infobody::thumburl(), quote(raii::json_escape(*thumburl))),
member(json::message::infobody::width(), raii::itostr(image.width()))
)),
member(json::message::msgtype(), quote("m.image"_ss)),
member(json::message::url(), quote(raii::json_escape(url)))
));
}
raii::string _video_body(const uploaded_video& video){
return raii::string(
"{"
"\"body\":\"" + raii::json_escape(video.name()) + "\","
"\"info\":{"
"\"h\":" + raii::itostr(video.height()) + ","
"\"mimetype\":\"" + video.mimetype() + "\","
"\"size\":" + raii::itostr(video.size()) + ","
"\"thumnail_info\":{"
"\"h\":" + raii::itostr(video.thumb_height()) + ","
"\"mimetype\":\"image/jpeg\","
"\"size\":" + raii::itostr(video.thumb_size()) + ","
"\"w\":" + raii::itostr(video.thumb_width()) +
"},"
"\"thumbnail_url\":\"" + video.thumb_url() + "\","
"\"w\":" + raii::itostr(video.width()) +
"},"
"\"msgtype\":\"m.video\","
"\"url\":\"" + raii::json_escape(video.url()) + "\""
"}");
object(
member(json::message::body(), quote(raii::json_escape(video.name()))),
member(json::message::info(), object(
member(json::message::infobody::height(), raii::itostr(video.height())),
member(json::message::infobody::mimetype(), quote(video.mimetype())),
member(json::message::infobody::size(), raii::itostr(video.size())),
member(json::message::infobody::thumbinfo(), object(
member(json::message::infobody::thumbnail::height(), raii::itostr(video.thumb_height())),
member(json::message::infobody::thumbnail::mimetype(), quote(video.thumb_mimetype())),
member(json::message::infobody::thumbnail::size(), raii::itostr(video.thumb_size())),
member(json::message::infobody::thumbnail::width(), raii::itostr(video.thumb_width()))
)),
member(json::message::infobody::thumburl(), quote(raii::json_escape(video.thumb_url()))),
member(json::message::infobody::width(), raii::itostr(video.width()))
)),
member(json::message::msgtype(), quote("m.video"_ss)),
member(json::message::url(), quote(raii::json_escape(video.url())))
));
}
raii::string _file_body(const uploaded_file& file){
return raii::string(
"{"
"\"body\":\"" + raii::json_escape(file.name()) + "\","
"\"info\":{"
"\"size\":" + raii::itostr(file.size()) +
"},"
"\"msgtype\":\"m.file\","
"\"url\":\"" + raii::json_escape(file.url()) + "\""
"}");
object(
member(json::message::body(), quote(raii::json_escape(file.name()))),
member(json::message::info(), object(
member(json::message::infobody::size(), raii::itostr(file.size()))
)),
member(json::message::msgtype(), quote("m.file"_ss)),
member(json::message::url(), quote(raii::json_escape(file.url())))
));
}
raii::string _audio_body(const uploaded_audio& audio){
return raii::string(
"{"
"\"body\":\"" + raii::json_escape(audio.name()) + "\","
"\"info\":{"
"\"mimetype\":\"" + raii::json_escape(audio.mimetype()) + "\","
"\"size\":" + raii::itostr(audio.size()) +
"},"
"\"msgtype\":\"m.audio\","
"\"url\":\"" + raii::json_escape(audio.url()) + "\""
"}");
object(
member(json::message::body(), quote(raii::json_escape(audio.name()))),
member(json::message::info(), object(
member(json::message::infobody::mimetype(), quote(audio.mimetype())),
member(json::message::infobody::size(), raii::itostr(audio.size()))
)),
member(json::message::msgtype(), quote("m.audio"_ss)),
member(json::message::url(), quote(raii::json_escape(audio.url())))
));
}
raii::string _message_body(const raii::string_base& msg){
return raii::string("{\"body\":\""_ss + raii::json_escape(msg) + "\",\"msgtype\":\"m.text\"}"_ss);
return raii::string(
object(
member(json::message::body(), quote(raii::json_escape(msg))),
member(json::message::msgtype(), quote("m.text"_ss))
));
}
raii::string _login_password(const raii::string_base& username, const raii::string_base& password){
return raii::string(
"{"
"\"type\":\"m.login.password\","
"\"identifier\":{"
"\"type\":\"m.id.user\","
"\"user\":\"" + raii::json_escape(username) + "\""
"},"
"\"password\":\"" + raii::json_escape(password) + "\""
"}"
);
object(
member(json::auth::type(), quote("m.login.password"_ss)),
member(json::auth::identifier(), object(
member(json::auth::identifierbody::type(), quote("m.id.user"_ss)),
member(json::auth::identifierbody::user(), quote(raii::json_escape(username)))
)),
member(json::auth::password(), quote(raii::json_escape(password)))
));
}
raii::string _change_psk_password(const raii::string_base& userid, const raii::string_base& newpass, const raii::string_base& oldpass, const raii::string_base& session){
return raii::string(
"{"
"\"new_password\":\"" + raii::json_escape(newpass) + "\","
"\"auth\":{"
"\"type\":\"m.login.password\","
"\"session\":\"" + session + "\","
"\"user\":\"" + raii::json_escape(userid) + "\","
"\"password\":\"" + raii::json_escape(oldpass) + "\""
"}"
"}");
object(
member(json::auth::newpassword(), quote(raii::json_escape(newpass))),
member(json::auth::auth(), object(
member(json::auth::authbody::type(), quote("m.login.password"_ss)),
member(json::auth::authbody::session(), quote(session)),
member(json::auth::authbody::user(), quote(raii::json_escape(userid))),
member(json::auth::authbody::password(), quote(raii::json_escape(oldpass)))
))
));
}
raii::string _displayname_set(const raii::string_base& newname){
return raii::string(
"{"
"\"displayname\":\"" + raii::json_escape(newname) + "\""
"}"
);
object(
member(json::client::displayname(), quote(raii::json_escape(newname)))
));
}
raii::string _avatar_set(const raii::string_base& mediaurl){
return raii::string(
"{"
"\"avatar_url\":\"" + raii::json_escape(mediaurl) + "\""
"}"
);
object(
member(json::client::avatarurl(), quote(raii::json_escape(mediaurl)))
));
}
raii::string _presence_set(const raii::string_base& status){
return raii::string(
"{"
"\"presence\":\"" + status + "\""
"}"
);
object(
member(json::client::presence(), quote(status))
));
}
raii::string _create_room(const raii::string_base& name, const raii::string_base& alias){
if(alias){
return raii::string(
"{"
"\"name\":\"" + raii::json_escape(name) + "\","
"\"room_alias_name\":\"" + raii::json_escape(alias) + "\""
"}"
);
object(
member(json::client::name(), quote(raii::json_escape(name))),
member(json::client::roomaliasname(), quote(raii::json_escape(alias)))
));
}else{
return raii::string(
"{"
"\"name\":\"" + raii::json_escape(name) + "\""
"}"
);
object(
member(json::client::name(), quote(raii::json_escape(name)))
));
}
}
raii::string _userid(const raii::string_base& id){
return raii::string(
"{"
"\"user_id\":\"" + raii::json_escape(id) + "\""
"}"
);
object(
member(json::session::userid(), quote(raii::json_escape(id)))
));
}
raii::string _userid_reason(const raii::string_base& id, const raii::string_base& reason){
return raii::string(
"{"
"\"user_id\":\"" + raii::json_escape(id) + "\","
"\"reason\":\"" + raii::json_escape(reason) + "\""
"}"
);
object(
member(json::session::userid(), quote(raii::json_escape(id))),
member(json::reason(), quote(raii::json_escape(reason)))
));
}
raii::string _typing(bool active, int timeout){
return raii::string(
"{"
"\"typing\":" + (active ? "true"_ss : "false"_ss) + "\","
"\"timeout\":" + raii::itostr(timeout) +
"}"
);
object(
member(json::client::typing(), active ? json::True() : json::False()),
member(json::client::timeout(), raii::itostr(timeout))
));
}
raii::string _redact(const raii::string_base& reason){
return raii::string(
"{"
"\"reason\":\"" + raii::json_escape(reason) + "\""
"}"
);
object(
member(json::reason(), quote(raii::json_escape(reason)))
));
}
raii::string _room_upgrade(int version){
return raii::string(
"{"
"\"new_version\":\"" + raii::itostr(version) + "\""
"}"
);
object(
member(json::rooms::newversion(), raii::itostr(version))
));
}
}