From 9ee251930d7a9af1e76d22a2a64fccb5e2b9ac6d Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Tue, 17 Aug 2021 10:31:07 +0200
Subject: [PATCH] SCRIPT: Opt for a one file script, with first the declaration
 then the implementation

---
 rsc/lua/module.lua                            |  6 +--
 src/Lib/Script/CRTPLuaScriptObject.hh         |  3 --
 .../CRTPLuaScriptObject/ModuleDeclaration.cc  | 29 +----------
 src/Lib/Script/LuaContext.cc                  | 11 ++---
 utils/lua/sample-spec.lua                     | 29 -----------
 utils/lua/sample-spec.module                  | 48 +++++++++++++++----
 6 files changed, 47 insertions(+), 79 deletions(-)
 delete mode 100644 utils/lua/sample-spec.lua

diff --git a/rsc/lua/module.lua b/rsc/lua/module.lua
index 8975ff8e..3468636a 100644
--- a/rsc/lua/module.lua
+++ b/rsc/lua/module.lua
@@ -86,21 +86,19 @@ end
 
 -- The module declaration block
 --      DeclareModule {
---          name = ..., description = ..., file = ..., author = ...,
+--          name = ..., description = ..., author = ...,
 --          revision = ..., imports = { ... }, options = { ... },
 --          fuctions = { ... }, jobs = { ... }
 --      }
---      DeclareModule { name = ..., file = ..., author = ... }
+--      DeclareModule { name = ..., author = ... }
 function DeclareModule(tbl)
     ___checkTable(tbl)
     if not tbl.name   then error("Invalid DeclareModule block, Missing name",   2) end
-    if not tbl.file   then error("Invalid DeclareModule block, Missing file",   2) end
     if not tbl.author then error("Invalid DeclareModule block, Missing author", 2) end
     local module = ModuleDeclaration()
 
     -- Standard things
     module:setName(tbl.name)
-    module:setImplementationFile(tbl.file)
     module:setAuthorName(tbl.author)
 
     -- Optional simple things
diff --git a/src/Lib/Script/CRTPLuaScriptObject.hh b/src/Lib/Script/CRTPLuaScriptObject.hh
index 989f0140..7405442e 100644
--- a/src/Lib/Script/CRTPLuaScriptObject.hh
+++ b/src/Lib/Script/CRTPLuaScriptObject.hh
@@ -240,7 +240,6 @@ script_class (ModuleDeclaration) {
     static int setAuthorName(lua_State *const) noexcept;
     static int setRevision(lua_State *const) noexcept;
     static int setDescription(lua_State *const) noexcept;
-    static int setImplementationFile(lua_State *const) noexcept;
     static int setImports(lua_State *const) noexcept;
     static int setOptions(lua_State *const) noexcept;
     static int setFunctions(lua_State *const) noexcept;
@@ -257,7 +256,6 @@ script_class (ModuleDeclaration) {
         LUA_DECL_METHOD(ModuleDeclaration, setDescription),
         LUA_DECL_METHOD(ModuleDeclaration, setRevision),
         LUA_DECL_METHOD(ModuleDeclaration, setAuthorName),
-        LUA_DECL_METHOD(ModuleDeclaration, setImplementationFile),
         LUA_DECL_METHOD(ModuleDeclaration, setImports),
         LUA_DECL_METHOD(ModuleDeclaration, setOptions),
         LUA_DECL_METHOD(ModuleDeclaration, setFunctions),
@@ -279,7 +277,6 @@ public:
     std::string authorName{};
     std::string revision{};
     std::string moduleDescription{};
-    std::string implementationFile{};
     std::vector<OptionDeclaration *> moduleOptions{};
     std::vector<FunctionDeclaration *> moduleFunctions{};
     std::vector<JobDeclaration *> moduleJobs{};
diff --git a/src/Lib/Script/CRTPLuaScriptObject/ModuleDeclaration.cc b/src/Lib/Script/CRTPLuaScriptObject/ModuleDeclaration.cc
index 82910f87..2b97727c 100644
--- a/src/Lib/Script/CRTPLuaScriptObject/ModuleDeclaration.cc
+++ b/src/Lib/Script/CRTPLuaScriptObject/ModuleDeclaration.cc
@@ -101,21 +101,6 @@ ModuleDeclaration::setDescription(lua_State *const L) noexcept
     LUA_RETURN_NOTHING(L);
 }
 
-int
-ModuleDeclaration::setImplementationFile(lua_State *const L) noexcept
-{
-    auto *const self         = ModuleDeclaration::CHECK(L, 1);
-    auto *const context      = LuaContext::getContext(L);
-    self->implementationFile = CHECK_STRING_VIEW(L, 2);
-    Utils::trim(self->implementationFile);
-    self->implementationFile =
-        QFileInfo(QFileInfo(context->getCurrentLuaFile().c_str()).absoluteDir(),
-                  self->implementationFile.c_str())
-            .absoluteFilePath()
-            .toStdString();
-    LUA_RETURN_NOTHING(L);
-}
-
 int
 ModuleDeclaration::setImports(lua_State *const L) noexcept
 {
@@ -200,23 +185,11 @@ ModuleDeclaration::validateModule(lua_State *const L) const noexcept
     auto *const context = LuaContext::getContext(L);
 
     // Minimal module file
-    if (moduleName.empty() || authorName.empty() || implementationFile.empty()) {
+    if (moduleName.empty() || authorName.empty()) {
         context->setFailed("The module does not have the minimal required information");
         return false;
     }
 
-    // Implementation file exists, relative to the .module file
-    {
-        QString moduleFile = context->getCurrentLuaFile().c_str();
-        QFileInfo moduleInfo(moduleFile);
-        QFileInfo fileInfo(moduleInfo.absoluteDir(), implementationFile.c_str());
-        if (!fileInfo.exists()) {
-            context->setFailed("The module " + moduleName +
-                               " does not have a valid implementation file");
-            return false;
-        }
-    }
-
     // Imports
     {
         std::vector<std::string> usedImports{};
diff --git a/src/Lib/Script/LuaContext.cc b/src/Lib/Script/LuaContext.cc
index 9ca957e8..bf874c2a 100644
--- a/src/Lib/Script/LuaContext.cc
+++ b/src/Lib/Script/LuaContext.cc
@@ -77,12 +77,6 @@ LuaContext::loadDocument(std::shared_ptr<ScriptDocument> doc) noexcept
         return Code::Error;
     }
 
-    auto *const mod = getModule(lastLoadedModule);
-    const QFileInfo impl(mod->implementationFile.c_str());
-    if (Code::Success != loadFile(impl.absoluteFilePath().toStdString().c_str())) {
-        setFailed("Failed to load implementation file");
-        return Code::Error;
-    }
     return Code::Success;
 }
 
@@ -130,6 +124,11 @@ LuaContext::loadFile(const char *file) noexcept
 QString
 LuaContext::getLastLuaError() noexcept
 {
+    const int type = lua_type(L, -1);
+    if (type != LUA_TSTRING) {
+        return QString("No lua error detected...");
+    }
+
     const char *error = lua_tostring(L, -1);
     QString ret       = QString("%1").arg(error);
     lua_pop(L, 1);
diff --git a/utils/lua/sample-spec.lua b/utils/lua/sample-spec.lua
deleted file mode 100644
index 21e7dea0..00000000
--- a/utils/lua/sample-spec.lua
+++ /dev/null
@@ -1,29 +0,0 @@
--- vim: ft=lua
-global = Vivy:global { }
-module = Vivy:module { "sample-spec" }
-
-utils       = module:import { "utils" }
-prettyPrint = module:import { "utils", "prettyPrint" }
-
-tripleCopySyl = module:export { "tripleCopySyl", function (syl)
-    return { syl:copy(), syl:copy(), syl:copy() }
-end }
-
-module:export { "printFoo", function () prettyPrint ("Bar") end }
-
-module:export { "retime_lines", LINE, function (opt, line)
-    line.start  = line.start  + opt.preTime
-    line.finish = line.finish + opt.postTime
-    if line.start  <= global:start()  then line.start  = global:start()  end
-    if line.finish >= global:finish() then line.finish = global:finish() end
-    return line
-end }
-
-module:export { "create_syllabes", SYLLABE, function (opt, syl)
-    local newSyls     = tripleCopySyl(syl)
-    newSyls[1].start  = syl.line.start
-    newSyls[1].finish = syl.start
-    newSyls[3].finish = syl.line.finish
-    newSyls[3].start  = syl.finish
-    return newSyls
-end }
diff --git a/utils/lua/sample-spec.module b/utils/lua/sample-spec.module
index c65d82e2..74ad9edb 100644
--- a/utils/lua/sample-spec.module
+++ b/utils/lua/sample-spec.module
@@ -1,17 +1,17 @@
--- vim: ft=lua
-custom_opt = DeclareOption { option1 = false }
-time_opt   = DeclareOption { preTime = -900, postTime = 300, }
-color_opt  = DeclareOption { color1 = Vivy:newColor("#314159") }
+--- Declaration
+
+local custom_opt = DeclareOption { option1 = false }
+local time_opt   = DeclareOption { preTime = -900, postTime = 300, }
+local color_opt  = DeclareOption { color1 = Vivy:newColor("#314159") }
 
-DeclareModule {
+local module = DeclareModule {
     name        = "sample-spec",
     description = "Sample script used for the specification proposition",
-    file        = "sample-spec.lua",
     author      = "Vivy",
     revision    = "rev-1254",
     imports     = { "utils" },
     options     = { custom_opt, time_opt, color_opt },
-    functions = {
+    functions   = {
         DeclareFunction { "tripleCopySyl" },
         DeclareFunction { "printFoo" },
         ImportFunction  { "utils", "prettyPrint" },
@@ -19,6 +19,36 @@ DeclareModule {
     jobs = {
         DeclareJob { "set_retime", options = { time_opt } },
         DeclareJob { "demultiply_syllabes" },
-        ImportJob  { "utils", "color_after_read_3", options = { color_opt } },
-    },
+        ImportJob  { "utils", "color_after_read_3", "utils", options = { color_opt } }
+    }
 }
+
+--- Implementation
+
+local utils       = module:import { "utils" }
+local prettyPrint = module:import { "utils", "prettyPrint" }
+
+local tripleCopySyl = module:export { "tripleCopySyl", function (syl)
+    return { syl:copy(), syl:copy(), syl:copy() }
+end }
+
+module:export { "printFoo", function () prettyPrint ("Bar") end }
+
+module:export { "retime_lines", LINE, function (opt, line)
+    line.start  = line.start + opt.preTime
+    line.finish = line.start + opt.postTime
+    if line.start <= 0 then line.start = 0 end
+    if line.finish >= Vivy:finish() then line.finish = Vivy:finish() end
+    return line
+end }
+
+module:export { "create_syllabes", SYLLABE, function (opt, syl)
+    local newSyls     = tripleCopySyl(syl)
+    newSyls[1].start  = syl.line.start
+    newSyls[1].finish = syl.start
+    newSyls[3].finish = syl.line.finish
+    newSyls[3].start  = syl.finish
+    return newSyls
+end }
+
+-- vim: ft=lua
-- 
GitLab