diff options
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. |
