#include "CrossLang.hpp" #include "TessesFramework/Serialization/BitConverter.hpp" #include "TessesFramework/Streams/ByteReader.hpp" #include "TessesFramework/Uuid.hpp" #include #include #include #include #include #include #include namespace Tesses::CrossLang { std::string ToString(GC* gc, TObject o) { if(std::holds_alternative(o)) { return std::get(o).ToString(); } if(std::holds_alternative(o)) { return std::get(o); } if(std::holds_alternative(o)) { return std::get(o).ToString(); } if(std::holds_alternative(o)) { return std::to_string(std::get(o)); } if(std::holds_alternative(o)) { return std::to_string(std::get(o)); } if(std::holds_alternative(o)) { return std::string{std::get(o)}; } if(std::holds_alternative(o)) { return "null"; } if(std::holds_alternative(o)) { return "undefined"; } if(std::holds_alternative(o)) { return std::get(o) ? "true" : "false"; } if(std::holds_alternative>(o)) { return std::get>(o)->ToString(); } if(std::holds_alternative>(o)) { return std::get>(o)->ToString(false); } if(std::holds_alternative(o)) { return std::get(o).ToString(Framework::UuidStringifyConfig::LowercaseNoCurly); } if(std::holds_alternative(o)) { auto obj = std::get(o).obj; auto dict = dynamic_cast(obj); auto list = dynamic_cast(obj); auto bArray = dynamic_cast(obj); auto natObj = dynamic_cast(obj); auto cls = dynamic_cast(obj); auto aArray = dynamic_cast(obj); if(aArray != nullptr) { std::string str={}; gc->BarrierBegin(); bool first=true; for(auto item : aArray->items) { if(!first) str.push_back('\n'); first=false; str.push_back('['); str.append(Json_Encode(item.first)); str.append("] = "); str.append(Json_Encode(item.second)); str.append(";"); } gc->BarrierEnd(); return str; } if(cls != nullptr) { auto res = cls->GetValue("","ToString"); TCallable* call; GCList ls(gc); if(GetObjectHeap(res,call)) return ToString(gc, call->Call(ls,{})); return cls->TypeName(); } if(natObj != nullptr) { GCList ls(gc); TObject o=natObj->CallMethod(ls,"ToString",{}); return ToString(gc, o); } if(dict != nullptr) { GCList ls(gc); if(dict->MethodExists(ls,"ToString")) return ToString(gc,dict->CallMethod(ls,"ToString",{})); else { return Json_Encode(dict); } } else if(bArray != nullptr) { return std::string(bArray->data.begin(),bArray->data.end()); } else if(list != nullptr) { return Json_Encode(list); } } return ""; } }