From b97b3a8cea6ed72b7cd5c9c2611f1cf231cefeb8 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Sat, 1 Oct 2022 20:34:03 +0200
Subject: [PATCH] MODULE: Make a module with a rust implementation for repo_rs

---
 src/module/module_repo_rs.c                 | 70 +++++++++++++--------
 src/rust/liblektor-rs/src/compat.rs         |  9 +++
 src/rust/liblektor-rs/src/lib.rs            |  6 +-
 src/rust/liblektor-rs/src/module/repo_rs.rs | 47 ++++++++++++++
 4 files changed, 104 insertions(+), 28 deletions(-)
 create mode 100644 src/rust/liblektor-rs/src/compat.rs

diff --git a/src/module/module_repo_rs.c b/src/module/module_repo_rs.c
index 97853939..458ae09b 100644
--- a/src/module/module_repo_rs.c
+++ b/src/module/module_repo_rs.c
@@ -7,7 +7,15 @@
  * Function from RUST *
  **********************/
 
-struct module_repo_rs_internal;
+struct repo_rs_intern;
+
+extern size_t lkt_module_repo_rs_get_struct_size(void);
+extern int32_t lkt_module_repo_rs_init(struct repo_rs_intern*, struct queue*, lkt_db*);
+extern int32_t lkt_module_repo_rs_free(struct repo_rs_intern*);
+extern int32_t lkt_module_repo_rs_update(struct repo_rs_intern*, struct lkt_uri *);
+extern int32_t lkt_module_repo_rs_dry_update(struct repo_rs_intern*);
+extern int32_t lkt_module_repo_rs_rescan(struct repo_rs_intern*);
+extern int32_t lkt_module_repo_rs_import(struct repo_rs_intern*);
 
 /********************
  * Export functions *
@@ -17,24 +25,35 @@ PRIVATE_FUNCTION int
 mod_new(va_list *va)
 {
     va_list copy;
-    struct module_repo_rs_internal **UNUSED repo;
     va_copy(copy, *va);
-    repo = (struct module_repo_rs_internal **)va_arg(copy, void **);
+    struct repo_rs_intern **repo = (struct repo_rs_intern **)va_arg(copy, void **);
+    struct queue *queue = va_arg(copy, struct queue *);
+    lkt_db *db          = va_arg(copy, lkt_db *);
+
+    if (NULL != *repo) {
+        LOG_ERROR("REPO", "Can't init two times the module");
+        return 1;
+    }
+    *repo = safe_malloc(lkt_module_repo_rs_get_struct_size());
+
+    const int32_t ret = lkt_module_repo_rs_init(*repo, queue, db);
+    lkt_queue_make_available(queue, LKT_EVENT_DB_UPDATING);
 
     va_end(copy);
-    return 1;
+    LOG_ERROR_IF(ret, "REPO", "Failed to create the module");
+    return ret;
 }
 
 PRIVATE_FUNCTION int
 mod_free(va_list *va)
 {
     va_list copy;
-    struct module_repo_rs_internal **UNUSED repo;
+    struct repo_rs_intern **repo;
     va_copy(copy, *va);
-    repo = (struct module_repo_rs_internal **)va_arg(copy, void **);
-
+    repo = (struct repo_rs_intern **)va_arg(copy, void **);
+    const int32_t ret = lkt_module_repo_rs_free(*repo);
     va_end(copy);
-    return 1;
+    return ret;
 }
 
 PRIVATE_FUNCTION int
@@ -44,7 +63,6 @@ mod_close(va_list *va)
     struct module_repo_rs_internal **UNUSED repo;
     va_copy(copy, *va);
     repo = (struct module_repo_rs_internal **)va_arg(copy, void **);
-
     va_end(copy);
     return 1;
 }
@@ -53,48 +71,50 @@ PRIVATE_FUNCTION int
 mod_update(va_list *va)
 {
     va_list copy;
-    struct module_repo_rs_internal **UNUSED repo;
+    struct repo_rs_intern **repo;
+    struct lkt_uri *uri_ptr;
     va_copy(copy, *va);
-    repo = (struct module_repo_rs_internal **)va_arg(copy, void **);
-
+    repo    = (struct repo_rs_intern **)va_arg(copy, void **);
+    uri_ptr = (struct lkt_uri *)va_arg(copy, struct lkt_uri *);
+    const int32_t ret = lkt_module_repo_rs_update(*repo, uri_ptr);
     va_end(copy);
-    return 1;
+    return ret;
 }
 
 PRIVATE_FUNCTION int
 mod_dry_update(va_list *va)
 {
     va_list copy;
-    struct module_repo_rs_internal **UNUSED repo;
+    struct repo_rs_intern **repo;
     va_copy(copy, *va);
-    repo = (struct module_repo_rs_internal **)va_arg(copy, void **);
-
+    repo = (struct repo_rs_intern **)va_arg(copy, void **);
+    const int32_t ret = lkt_module_repo_rs_dry_update(*repo);
     va_end(copy);
-    return 1;
+    return ret;
 }
 
 PRIVATE_FUNCTION int
 mod_rescan(va_list *va)
 {
     va_list copy;
-    struct module_repo_rs_internal **UNUSED repo;
+    struct repo_rs_intern **repo;
     va_copy(copy, *va);
-    repo = (struct module_repo_rs_internal **)va_arg(copy, void **);
-
+    repo = (struct repo_rs_intern **)va_arg(copy, void **);
+    const int32_t ret = lkt_module_repo_rs_rescan(*repo);
     va_end(copy);
-    return 1;
+    return ret;
 }
 
 PRIVATE_FUNCTION int
 mod_import(va_list *va)
 {
     va_list copy;
-    struct module_repo_rs_internal **UNUSED repo;
+    struct repo_rs_intern **repo;
     va_copy(copy, *va);
-    repo = (struct module_repo_rs_internal **)va_arg(copy, void **);
-
+    repo = (struct repo_rs_intern **)va_arg(copy, void **);
+    const int32_t ret = lkt_module_repo_rs_import(*repo);
     va_end(copy);
-    return 1;
+    return ret;
 }
 
 REG_BEGIN(repo_rs_reg)
diff --git a/src/rust/liblektor-rs/src/compat.rs b/src/rust/liblektor-rs/src/compat.rs
new file mode 100644
index 00000000..0588c98a
--- /dev/null
+++ b/src/rust/liblektor-rs/src/compat.rs
@@ -0,0 +1,9 @@
+pub const LEKTOR_TAG_MAX: usize = 256;
+
+pub struct LktQueue;
+pub struct LktDb;
+pub struct LktUri;
+
+pub type LktQueuePtr = *mut LktQueue;
+pub type LktDbPtr = *mut LktDb;
+pub type LktUriPtr = *mut LktUri;
diff --git a/src/rust/liblektor-rs/src/lib.rs b/src/rust/liblektor-rs/src/lib.rs
index 641e7637..a691be2f 100644
--- a/src/rust/liblektor-rs/src/lib.rs
+++ b/src/rust/liblektor-rs/src/lib.rs
@@ -1,9 +1,9 @@
 #![allow(dead_code)]
 
-mod module;
+mod compat;
 mod database;
 mod mkv;
+mod module;
 
+pub(crate) use compat::*;
 pub(crate) use libc::{c_char, c_int, c_long, c_void, size_t};
-
-pub const LEKTOR_TAG_MAX: usize = 256;
diff --git a/src/rust/liblektor-rs/src/module/repo_rs.rs b/src/rust/liblektor-rs/src/module/repo_rs.rs
index e69de29b..61a54d27 100644
--- a/src/rust/liblektor-rs/src/module/repo_rs.rs
+++ b/src/rust/liblektor-rs/src/module/repo_rs.rs
@@ -0,0 +1,47 @@
+use crate::*;
+
+type LktModuleRepoRsPtr = *mut LktModuleRepoRs;
+struct LktModuleRepoRs {
+    queue: LktQueuePtr,
+}
+
+#[no_mangle]
+extern "C" fn lkt_module_repo_rs_get_struct_size() -> size_t {
+    std::mem::size_of::<LktModuleRepoRs>()
+}
+
+#[no_mangle]
+extern "C" fn lkt_module_repo_rs_init(
+    repo: LktModuleRepoRsPtr,
+    queue: LktQueuePtr,
+    db: LktDbPtr,
+) -> i32 {
+    let _repo: &mut LktModuleRepoRs = unsafe { std::mem::transmute(repo) };
+    1
+}
+
+#[no_mangle]
+extern "C" fn lkt_module_repo_rs_free(repo: LktModuleRepoRsPtr) -> i32 {
+    let _repo: &mut LktModuleRepoRs = unsafe { std::mem::transmute(repo) };
+    1
+}
+
+#[no_mangle]
+extern "C" fn lkt_module_repo_rs_update(repo: LktModuleRepoRsPtr, uri: LktUriPtr) -> i32 {
+    1
+}
+
+#[no_mangle]
+extern "C" fn lkt_module_repo_rs_dry_update(repo: LktModuleRepoRsPtr) -> i32 {
+    1
+}
+
+#[no_mangle]
+extern "C" fn lkt_module_repo_rs_rescan(repo: LktModuleRepoRsPtr) -> i32 {
+    1
+}
+
+#[no_mangle]
+extern "C" fn lkt_module_repo_rs_import(repo: LktModuleRepoRsPtr) -> i32 {
+    1
+}
-- 
GitLab