diff options
| author | jacqueline <me@jacqueline.id.au> | 2024-09-19 15:03:43 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2024-09-19 15:03:43 +1000 |
| commit | 9c95c2b4222da1fb31855f3985ab96d90865086d (patch) | |
| tree | 8a5bdca0fdffa3720cbef7b683295f629ce308da /src/tangara/lua/lua_database.cpp | |
| parent | 111085b857249a9442e118a5e37a1732716da6a2 (diff) | |
| parent | 1eddfe97d9398215d4512785c669cf7cc94b6223 (diff) | |
| download | tangara-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.cpp | 72 |
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. |
