From 40205a928d3ac176e19349520ee782bc3e5606e1 Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Mon, 22 Dec 2025 14:20:20 -0600 Subject: [PATCH] Add Json Doc --- Packaging/CPKG/ConsoleOrServer/main.cpp | 6 ++-- Packaging/CPKG/Wii/main.cpp | 6 ++-- docs/WHAT_IS_TOBJECT.md | 2 +- include/CrossLang.hpp | 2 ++ src/crosslang.cpp | 6 +++- src/crosslangvm.cpp | 2 ++ src/runtime_methods/json.cpp | 47 +++++++++++++++++++++++-- 7 files changed, 63 insertions(+), 8 deletions(-) diff --git a/Packaging/CPKG/ConsoleOrServer/main.cpp b/Packaging/CPKG/ConsoleOrServer/main.cpp index 6410963..1a494d2 100644 --- a/Packaging/CPKG/ConsoleOrServer/main.cpp +++ b/Packaging/CPKG/ConsoleOrServer/main.cpp @@ -33,6 +33,8 @@ int main(int argc, char** argv) port = std::stoi(item.second); } } + + env->EnsureDictionary(&gc,"Net")->SetValue("WebServerPort", (int64_t)port); TList* args2 = TList::Create(ls); args2->Add(exePath.ToString()); for(auto& item : args.positional) @@ -40,7 +42,7 @@ int main(int argc, char** argv) args2->Add(item); } - auto res = env->CallFunction(ls, "WebAppMain", {args2}); + auto res = env->CallFunctionWithFatalError(ls, "WebAppMain", {args2}); auto svr2 = Tesses::CrossLang::ToHttpServer(&gc,res); if(svr2 == nullptr) return 1; Tesses::Framework::Http::HttpServer svr(port,svr2); @@ -63,7 +65,7 @@ int main(int argc, char** argv) args->Add(exePath.ToString()); for(int arg=1;argAdd(argv[arg]); - auto res = env->CallFunction(ls,"main",{args}); + auto res = env->CallFunctionWithFatalError(ls,"main",{args}); int64_t iresult; if(GetObject(res,iresult)) return (int)iresult; diff --git a/Packaging/CPKG/Wii/main.cpp b/Packaging/CPKG/Wii/main.cpp index 1aa1792..4f95c97 100644 --- a/Packaging/CPKG/Wii/main.cpp +++ b/Packaging/CPKG/Wii/main.cpp @@ -39,6 +39,8 @@ int main(int argc, char** argv) port = std::stoi(item.second); } } + + env->EnsureDictionary(&gc,"Net")->SetValue("WebServerPort", (int64_t)port); TList* args2 = TList::Create(ls); args2->Add(exePath.ToString()); for(auto& item : args.positional) @@ -46,7 +48,7 @@ int main(int argc, char** argv) args2->Add(item); } - auto res = env->CallFunction(ls, "WebAppMain", {args2}); + auto res = env->CallFunctionWithFatalError(ls, "WebAppMain", {args2}); auto svr2 = Tesses::CrossLang::ToHttpServer(&gc,res); if(svr2 == nullptr) return 1; Tesses::Framework::Http::HttpServer svr(port,svr2); @@ -69,7 +71,7 @@ int main(int argc, char** argv) args->Add(exePath.ToString()); for(int arg=0;argAdd(argv[arg]); - auto res = env->CallFunction(ls,"main",{args}); + auto res = env->CallFunctionWithFatalError(ls,"main",{args}); int64_t iresult; if(GetObject(res,iresult)) return (int)iresult; diff --git a/docs/WHAT_IS_TOBJECT.md b/docs/WHAT_IS_TOBJECT.md index 3172ab5..2527f97 100644 --- a/docs/WHAT_IS_TOBJECT.md +++ b/docs/WHAT_IS_TOBJECT.md @@ -3,7 +3,7 @@ What is TObject It is a std::variant that can be (not in that order) -- Undefined (Tesses::CrossLang::Undefined) +- Undefined (std::monostate) - Null (std::nullptr_t) - Long (int64_t) - Double (double) diff --git a/include/CrossLang.hpp b/include/CrossLang.hpp index 381000a..b467eb0 100644 --- a/include/CrossLang.hpp +++ b/include/CrossLang.hpp @@ -2540,6 +2540,8 @@ class GC { void LoadPlugin(GC* gc, TRootEnvironment* env, Tesses::Framework::Filesystem::VFSPath sharedObjectPath); std::string Json_Encode(TObject o,bool indent=false); TObject Json_Decode(GCList ls,std::string str); + std::string Json_DocEncode(TObject o,bool indent); + TObject Json_DocDecode(GCList ls,std::string str); //DO NOT USE DIRECTLY class SharedPtrTObject { GCList* ls; diff --git a/src/crosslang.cpp b/src/crosslang.cpp index 852b7a5..79882e4 100644 --- a/src/crosslang.cpp +++ b/src/crosslang.cpp @@ -58,7 +58,11 @@ int main(int argc, char** argv) auto p = Tesses::Framework::Platform::Environment::GetRealExecutablePath(Tesses::Framework::Filesystem::LocalFS->SystemToVFSPath(argv[0])).GetParent().GetParent() / "share" / "Tesses" / "CrossLang" / "Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm"; - + if(argc == 2 && strcmp(argv[1],"configdir") == 0) + { + std::cout << dir.ToString() << std::endl; + return 0; + } if(argc > 1 && strcmp(argv[1],"update-shell") == 0) { diff --git a/src/crosslangvm.cpp b/src/crosslangvm.cpp index 1abe834..d277e24 100644 --- a/src/crosslangvm.cpp +++ b/src/crosslangvm.cpp @@ -29,6 +29,8 @@ int main(int argc, char** argv) port = std::stoi(item.second); } } + + env->EnsureDictionary(&gc,"Net")->SetValue("WebServerPort", (int64_t)port); TList* args2 = TList::Create(ls); for(auto& item : args.positional) { diff --git a/src/runtime_methods/json.cpp b/src/runtime_methods/json.cpp index 8de5fc8..cc301e6 100644 --- a/src/runtime_methods/json.cpp +++ b/src/runtime_methods/json.cpp @@ -81,6 +81,21 @@ namespace Tesses::CrossLang } return "null"; } + static TObject JsonDocEncode(GCList& ls2, std::vector args) + { + if(args.size() >= 1) + { + bool indent = (args.size() == 2 && std::holds_alternative(args[1]) && std::get(args[1])); + + auto json = JsonSerialize(args[0]); + JArray ar; + if(TryGetJToken(json,ar)) + return Json::DocEncode(ar,indent); + + + } + return ""; + } static TObject JsonDeserialize(GCList& ls2,JToken json) { if(std::holds_alternative(json)) return nullptr; @@ -138,6 +153,19 @@ namespace Tesses::CrossLang } return Undefined(); } + static TObject JsonDocDecode(GCList& ls2,std::vector args) + { + if(args.size() > 0 && std::holds_alternative(args[0])) + { + + + return JsonDeserialize(ls2, Json::DocDecode(std::get(args[0]))); + + + } + + return Undefined(); + } std::string Json_Encode(TObject o,bool indent) { return Json::Encode(JsonSerialize(o),indent); @@ -146,14 +174,29 @@ namespace Tesses::CrossLang { return JsonDeserialize(ls,Json::Decode(str)); } + std::string Json_DocEncode(TObject o,bool indent) + { + auto obj = JsonSerialize(o); + JArray ls; + if(TryGetJToken(obj,ls)) + return Json::DocEncode(ls,indent); + return ""; + } + TObject Json_DocDecode(GCList ls,std::string str) + { + return JsonDeserialize(ls,Json::DocDecode(str)); + } void TStd::RegisterJson(GC* gc,TRootEnvironment* env) { env->permissions.canRegisterJSON=true; GCList ls(gc); TDictionary* dict = TDictionary::Create(ls); - dict->DeclareFunction(gc, "Decode","Deserialize Json",{"Json string"},JsonDecode); - dict->DeclareFunction(gc, "Encode","Serialize Json",{"any","$indent"},JsonEncode); + dict->DeclareFunction(gc, "Decode","Deserialize Json",{"jsonString"},JsonDecode); + dict->DeclareFunction(gc, "Encode","Serialize Json",{"any","$indent"},JsonEncode); + dict->DeclareFunction(gc, "DocDecode", "Deserialize JsonDoc", {"jsonDocString"},JsonDocDecode); + dict->DeclareFunction(gc, "DocEncode", "Serialize JsonDoc", {"ls","$indent"},JsonDocEncode); + gc->BarrierBegin();