summaryrefslogtreecommitdiff
path: root/src/tangara/lua/lua_database.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-09-19 15:03:43 +1000
committerjacqueline <me@jacqueline.id.au>2024-09-19 15:03:43 +1000
commit9c95c2b4222da1fb31855f3985ab96d90865086d (patch)
tree8a5bdca0fdffa3720cbef7b683295f629ce308da /src/tangara/lua/lua_database.cpp
parent111085b857249a9442e118a5e37a1732716da6a2 (diff)
parent1eddfe97d9398215d4512785c669cf7cc94b6223 (diff)
downloadtangara-fw-9c95c2b4222da1fb31855f3985ab96d90865086d.tar.gz
Merge branch 'main' of codeberg.org:cool-tech-zone/tangara-fw
Diffstat (limited to 'src/tangara/lua/lua_database.cpp')
-rw-r--r--src/tangara/lua/lua_database.cpp72
1 files changed, 71 insertions, 1 deletions
diff --git a/src/tangara/lua/lua_database.cpp b/src/tangara/lua/lua_database.cpp
index bf84a399..e184265a 100644
--- a/src/tangara/lua/lua_database.cpp
+++ b/src/tangara/lua/lua_database.cpp
@@ -73,6 +73,56 @@ static auto indexes(lua_State* state) -> int {
return 1;
}
+auto pushTagValue(lua_State* L, const database::TagValue& val) -> void {
+ std::visit(
+ [&](auto&& arg) {
+ using T = std::decay_t<decltype(arg)>;
+ if constexpr (std::is_same_v<T, std::pmr::string>) {
+ lua_pushlstring(L, arg.data(), arg.size());
+ } else if constexpr (std::is_same_v<
+ T, std::span<const std::pmr::string>>) {
+ lua_createtable(L, 0, arg.size());
+ for (const auto& i : arg) {
+ lua_pushlstring(L, i.data(), i.size());
+ lua_pushboolean(L, true);
+ lua_rawset(L, -3);
+ }
+ } else if constexpr (std::is_same_v<T, uint32_t>) {
+ lua_pushinteger(L, arg);
+ } else {
+ lua_pushnil(L);
+ }
+ },
+ val);
+}
+
+static void pushTrack(lua_State* L, const database::Track& track) {
+ lua_newtable(L);
+
+ lua_pushliteral(L, "tags");
+ lua_newtable(L);
+ for (const auto& tag : track.tags().allPresent()) {
+ lua_pushstring(L, database::tagName(tag).c_str());
+ pushTagValue(L, track.tags().get(tag));
+ lua_settable(L, -3);
+ }
+ lua_settable(L, -3);
+
+ lua_pushliteral(L, "id");
+ lua_pushinteger(L, track.data().id);
+ lua_settable(L, -3);
+
+ lua_pushliteral(L, "filepath");
+ lua_pushstring(L, track.data().filepath.c_str());
+ lua_settable(L, -3);
+
+ lua_pushliteral(L, "saved_position");
+ lua_pushinteger(L, track.data().last_position);
+ lua_settable(L, -3);
+
+
+}
+
static auto version(lua_State* L) -> int {
Bridge* instance = Bridge::Get(L);
auto db = instance->services().database().lock();
@@ -111,9 +161,29 @@ static auto update(lua_State* L) -> int {
return 0;
}
+static auto track_by_id(lua_State* L) -> int {
+ auto id = luaL_checkinteger(L, -1);
+
+ Bridge* instance = Bridge::Get(L);
+ auto db = instance->services().database().lock();
+ if (!db) {
+ return 0;
+ }
+
+ auto track = db->getTrack(id);
+ if (!track) {
+ return 0;
+ }
+
+ pushTrack(L, *track);
+
+ return 1;
+}
+
static const struct luaL_Reg kDatabaseFuncs[] = {
{"indexes", indexes}, {"version", version}, {"size", size},
- {"recreate", recreate}, {"update", update}, {NULL, NULL}};
+ {"recreate", recreate}, {"update", update}, {"track_by_id", track_by_id},
+ {NULL, NULL}};
/*
* Struct to be used as userdata for the Lua representation of database records.