Files
crosslang/src/runtime_methods/env.cpp

157 lines
5.9 KiB
C++

#include "CrossLang.hpp"
#include "TessesFramework/Serialization/BitConverter.hpp"
#if defined(_WIN32)
#include <windows.h>
#endif
namespace Tesses::CrossLang {
using namespace Tesses::Framework::Platform::Environment;
#if defined(_WIN32)
static char EnvPathSeperator = ';';
#else
static char EnvPathSeperator = ':';
#endif
Tesses::Framework::Filesystem::VFSPath CrossLangConfigPath("");
Tesses::Framework::Filesystem::VFSPath GetCrossLangConfigDir() {
if (!CrossLangConfigPath.path.empty())
return CrossLangConfigPath;
return SpecialFolders::GetConfig() / "Tesses" / "CrossLang";
}
static TObject Env_getCrossLangConfig(GCList &ls, std::vector<TObject> args) {
return GetCrossLangConfigDir();
}
static TObject Env_getPlatform(GCList &ls, std::vector<TObject> args) {
return Tesses::Framework::Platform::Environment::GetPlatform();
}
static TObject Env_GetAt(GCList &ls, std::vector<TObject> args) {
std::string key;
if (GetArgument(args, 0, key)) {
auto v = GetVariable(key);
if (v)
return v.value();
}
return nullptr;
}
static TObject Env_SetAt(GCList &ls, std::vector<TObject> args) {
std::string key;
std::string value;
if (GetArgument(args, 0, key)) {
if (GetArgument(args, 1, value)) {
SetVariable(key, value);
return value;
} else {
SetVariable(key, std::nullopt);
}
}
return nullptr;
}
static TObject Env_getDownloads(GCList &ls, std::vector<TObject> args) {
return SpecialFolders::GetDownloads();
}
static TObject Env_getMusic(GCList &ls, std::vector<TObject> args) {
return SpecialFolders::GetMusic();
}
static TObject Env_getPictures(GCList &ls, std::vector<TObject> args) {
return SpecialFolders::GetPictures();
}
static TObject Env_getVideos(GCList &ls, std::vector<TObject> args) {
return SpecialFolders::GetVideos();
}
static TObject Env_getDocuments(GCList &ls, std::vector<TObject> args) {
return SpecialFolders::GetDocuments();
}
static TObject Env_getConfig(GCList &ls, std::vector<TObject> args) {
return SpecialFolders::GetConfig();
}
static TObject Env_getDesktop(GCList &ls, std::vector<TObject> args) {
return SpecialFolders::GetDesktop();
}
static TObject Env_getState(GCList &ls, std::vector<TObject> args) {
return SpecialFolders::GetState();
}
static TObject Env_getCache(GCList &ls, std::vector<TObject> args) {
return SpecialFolders::GetCache();
}
static TObject Env_getData(GCList &ls, std::vector<TObject> args) {
return SpecialFolders::GetData();
}
static TObject Env_getUser(GCList &ls, std::vector<TObject> args) {
return SpecialFolders::GetHomeFolder();
}
static TObject Env_GetRealExecutablePath(GCList &ls,
std::vector<TObject> args) {
Tesses::Framework::Filesystem::VFSPath p;
if (GetArgumentAsPath(args, 0, p)) {
return GetRealExecutablePath(p);
}
return Tesses::Framework::Filesystem::VFSPath();
}
static TObject Env_GetAll(GCList &ls, std::vector<TObject> args) {
ls.GetGC()->BarrierBegin();
TList *list = TList::Create(ls);
std::vector<std::pair<std::string, std::string>> env;
Tesses::Framework::Platform::Environment::GetEnvironmentVariables(env);
for (auto &item : env) {
list->Add(TDictionary::Create(
ls, {TDItem("Key", item.first), TDItem("Value", item.second)}));
}
ls.GetGC()->BarrierEnd();
return list;
}
static TObject Env_getLittleEndian(GCList &ls, std::vector<TObject> args) {
return Tesses::Framework::Serialization::BitConverter::IsLittleEndian();
}
void TStd::RegisterEnv(std::shared_ptr<GC> gc, TRootEnvironment *env) {
env->permissions.canRegisterEnv = true;
GCList ls(gc);
TDictionary *dict = TDictionary::Create(ls);
dict->DeclareFunction(gc, "GetAt", "Get environment variable", {"key"},
Env_GetAt);
dict->DeclareFunction(gc, "SetAt", "Set environment variable",
{"key", "value"}, Env_SetAt);
dict->DeclareFunction(gc, "GetAll", "Get all of the environment variables",
{}, Env_GetAll);
dict->DeclareFunction(gc, "getDesktop", "Get desktop folder", {},
Env_getDesktop);
dict->DeclareFunction(gc, "getDownloads", "Get downloads folder", {},
Env_getDownloads);
dict->DeclareFunction(gc, "getDocuments", "Get documents folder", {},
Env_getDocuments);
dict->DeclareFunction(gc, "getMusic", "Get music folder", {}, Env_getMusic);
dict->DeclareFunction(gc, "getPictures", "Get pictures folder", {},
Env_getPictures);
dict->DeclareFunction(gc, "getVideos", "Get videos folder", {},
Env_getVideos);
dict->DeclareFunction(gc, "getState", "Get state folder", {}, Env_getState);
dict->DeclareFunction(gc, "getCache", "Get cache folder", {}, Env_getCache);
dict->DeclareFunction(gc, "getConfig", "Get config folder", {},
Env_getConfig);
dict->DeclareFunction(gc, "getCrossLangConfig",
"Get crosslang configuration folder", {},
Env_getCrossLangConfig);
dict->DeclareFunction(gc, "getData", "Get data folder", {}, Env_getData);
dict->DeclareFunction(gc, "getUser", "Get user folder", {}, Env_getUser);
dict->DeclareFunction(gc, "getPlatform", "Get platform name", {},
Env_getPlatform);
dict->DeclareFunction(gc, "GetRealExecutablePath",
"Get the absolute path for executable", {"path"},
Env_GetRealExecutablePath);
dict->DeclareFunction(gc, "getLittleEndian",
"Is the platform little endian", {},
Env_getLittleEndian);
gc->BarrierBegin();
dict->SetValue("EnvPathSeperator", EnvPathSeperator);
env->SetVariable("Env", dict);
gc->BarrierEnd();
}
} // namespace Tesses::CrossLang