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" #include "matrix/upload_info.hpp"
namespace matrix::json{ namespace matrix::json{
raii::string _empty(void); raii::static_string _empty(void);
raii::string _image_body(const uploaded_image& image); raii::string _image_body(const uploaded_image& image);
raii::string _video_body(const uploaded_video& video); raii::string _video_body(const uploaded_video& video);

View File

@ -5,6 +5,10 @@
namespace matrix::json{ 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{ namespace message{
constexpr raii::static_string body(void){return "body"_ss;} constexpr raii::static_string body(void){return "body"_ss;}
constexpr raii::static_string info(void){return "info"_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 identifier(void){return "identifier"_ss;}
constexpr raii::static_string password(void){return "password"_ss;} constexpr raii::static_string password(void){return "password"_ss;}
constexpr raii::static_string newpassword(void){return "new_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{ namespace identifierbody{
constexpr raii::static_string type(void){return auth::type();} 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 auth::authbody::session();}
constexpr raii::static_string session(void){return "session"_ss;} constexpr raii::static_string user(void){return auth::authbody::user();}
constexpr raii::static_string password(void){return auth::password();} 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 joined(void){return "joined"_ss;}
constexpr raii::static_string eventid(void){return "event_id"_ss;} constexpr raii::static_string eventid(void){return "event_id"_ss;}
constexpr raii::static_string chunk(void){return "chunk"_ss;} constexpr raii::static_string chunk(void){return "chunk"_ss;}
constexpr raii::static_string newversion(void){return "new_version"_ss;}
} }
namespace client{ namespace client{
constexpr raii::static_string presence(void){return "presence"_ss;} 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 avatarurl(void){return "avatar_url"_ss;}
constexpr raii::static_string roomid(void){return "room_id"_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 joinedrooms(void){return "joined_rooms"_ss;}
constexpr raii::static_string contenturi(void){return "content_uri"_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{ namespace session{
constexpr raii::static_string session(void){return "session"_ss;} constexpr raii::static_string session(void){return "session"_ss;}

View File

@ -23,6 +23,7 @@ OBJDIR::=obj
DEPDIR::=$(OBJDIR)/dep DEPDIR::=$(OBJDIR)/dep
LIBDIR::=lib LIBDIR::=lib
INCLUDE_DIRS::=include 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 CXXFLAGS::=-std=c++17 -Wall -pedantic -Wextra
EXT::=cpp EXT::=cpp
MAIN_LIBRARY::=rmatrix MAIN_LIBRARY::=rmatrix
@ -64,9 +65,9 @@ ifeq ($(RELEASE),1)
CXXFLAGS+=-O2 -Wno-strict-aliasing CXXFLAGS+=-O2 -Wno-strict-aliasing
else ifeq ($(MEMCHK),1) else ifeq ($(MEMCHK),1)
LDFLAGS+=-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls 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 else
CXXFLAGS+=-O0 -g CXXFLAGS+=-O0 -g3 -ggdb
endif endif

View File

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

View File

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