diff --git a/cpp/include/loot/database_interface.h b/cpp/include/loot/database_interface.h index 75d85759..750291cc 100644 --- a/cpp/include/loot/database_interface.h +++ b/cpp/include/loot/database_interface.h @@ -145,6 +145,13 @@ public: */ virtual std::vector GetKnownBashTags() const = 0; + /** + * @brief Gets the Bash Tags that are listed in the loaded userlist. + * @details Bash Tag suggestions can include Bash Tags not in this list. + * @returns The Bash Tag names, which may include duplicates. + */ + virtual std::vector GetUserKnownBashTags() const = 0; + /** * @brief Get all general messages listed in the loaded metadata lists. * @param evaluateConditions diff --git a/cpp/src/api/database.cpp b/cpp/src/api/database.cpp index 239ab176..2c5c3f13 100644 --- a/cpp/src/api/database.cpp +++ b/cpp/src/api/database.cpp @@ -68,6 +68,15 @@ std::vector Database::GetKnownBashTags() const { } } +std::vector Database::GetUserKnownBashTags() const { + try { + return convert( + database_->user_known_bash_tags()); + } catch (const ::rust::Error& e) { + std::rethrow_exception(mapError(e)); + } +} + std::vector Database::GetGeneralMessages( bool evaluateConditions) const { try { diff --git a/cpp/src/api/database.h b/cpp/src/api/database.h index b05899d5..0a66dc47 100644 --- a/cpp/src/api/database.h +++ b/cpp/src/api/database.h @@ -30,6 +30,8 @@ public: std::vector GetKnownBashTags() const override; + std::vector GetUserKnownBashTags() const override; + std::vector GetGeneralMessages( bool evaluateConditions = false) const override; diff --git a/cpp/src/database.rs b/cpp/src/database.rs index 4bdfaaea..2ef70771 100644 --- a/cpp/src/database.rs +++ b/cpp/src/database.rs @@ -111,6 +111,15 @@ impl Database { .known_bash_tags()) } + pub fn user_known_bash_tags(&self) -> Result, VerboseError> { + Ok(self + .0 + .read() + .map_err(DatabaseLockPoisonError::from)? + .user_known_bash_tags() + .to_vec()) + } + pub fn general_messages( &self, evaluate_conditions: bool, diff --git a/cpp/src/lib.rs b/cpp/src/lib.rs index 1e0c128b..e60ae993 100644 --- a/cpp/src/lib.rs +++ b/cpp/src/lib.rs @@ -270,6 +270,8 @@ mod ffi { pub fn known_bash_tags(&self) -> Result>; + pub fn user_known_bash_tags(&self) -> Result>; + pub fn general_messages(&self, evaluate_conditions: bool) -> Result>; pub fn groups(&self, include_user_metadata: bool) -> Result>; diff --git a/cpp/src/tests/api/interface/database_interface_test.h b/cpp/src/tests/api/interface/database_interface_test.h index 4a9fe169..c38b63a3 100644 --- a/cpp/src/tests/api/interface/database_interface_test.h +++ b/cpp/src/tests/api/interface/database_interface_test.h @@ -485,6 +485,23 @@ TEST_P(DatabaseInterfaceTest, EXPECT_EQ(expectedTags, tags); } +TEST_P(DatabaseInterfaceTest, + getUserKnownBashTagsShouldReturnAllBashTagsListedInLoadedUserMetadata) { + ASSERT_NO_THROW(GenerateMasterlist()); + ASSERT_NO_THROW(GenerateUserlist()); + + ASSERT_NO_THROW(handle_->GetDatabase().LoadMasterlist(masterlistPath)); + ASSERT_NO_THROW(handle_->GetDatabase().LoadUserlist(userlistPath_)); + + auto tags = handle_->GetDatabase().GetUserKnownBashTags(); + + std::vector expectedTags({ + "RaceRelations", + "C.Lighting", + }); + EXPECT_EQ(expectedTags, tags); +} + TEST_P(DatabaseInterfaceTest, getGeneralMessagesShouldGetGeneralMessagesFromTheMasterlistAndUserlist) { ASSERT_NO_THROW(GenerateMasterlist()); diff --git a/nodejs/src/database.rs b/nodejs/src/database.rs index 55a6c818..11d11eac 100644 --- a/nodejs/src/database.rs +++ b/nodejs/src/database.rs @@ -147,6 +147,16 @@ impl Database { .known_bash_tags()) } + #[napi] + pub fn user_known_bash_tags(&self) -> Result, VerboseError> { + Ok(self + .0 + .read() + .map_err(DatabaseLockPoisonError::from)? + .user_known_bash_tags() + .to_vec()) + } + #[napi] pub fn general_messages( &self, diff --git a/python/src/database.rs b/python/src/database.rs index 62bdde34..cc505341 100644 --- a/python/src/database.rs +++ b/python/src/database.rs @@ -115,6 +115,15 @@ impl Database { .known_bash_tags()) } + pub fn user_known_bash_tags(&self) -> Result, VerboseError> { + Ok(self + .0 + .read() + .map_err(DatabaseLockPoisonError::from)? + .user_known_bash_tags() + .to_vec()) + } + pub fn general_messages( &self, evaluate_conditions: bool, diff --git a/src/database/mod.rs b/src/database/mod.rs index 8da34b8c..3d09ed58 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -173,6 +173,13 @@ impl Database { tags } + /// Gets the Bash Tags that are listed in the loaded userlist. + /// + /// Bash Tag suggestions can include Bash Tags not in this list. + pub fn user_known_bash_tags(&self) -> &[String] { + self.userlist.bash_tags() + } + /// Get all general messages listed in the loaded metadata lists. pub fn general_messages( &self, @@ -892,6 +899,21 @@ plugins: ); } + #[test] + fn user_known_bash_tags_should_return_only_known_bash_tags_in_the_userlist() { + let fixture = Fixture::new(GameType::Oblivion); + let mut database = fixture.database(); + + database.load_masterlist(&fixture.metadata_path).unwrap(); + + let userlist_path = fixture.inner.local_path.join("userlist.yaml"); + std::fs::write(&userlist_path, "bash_tags: [Relev, Delev]").unwrap(); + + database.load_userlist(&userlist_path).unwrap(); + + assert_eq!(&["Relev", "Delev"], database.user_known_bash_tags()); + } + mod general_messages { use super::*;