mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
Add Database::set_user_general_messages()
This commit is contained in:
@@ -191,6 +191,14 @@ public:
|
||||
virtual std::vector<Message> GetUserGeneralMessages(
|
||||
bool evaluateConditions = false) const = 0;
|
||||
|
||||
/**
|
||||
* @brief Sets the general messages to store in the userlist, replacing any
|
||||
* messages already stored there.
|
||||
* @param messages
|
||||
* The messages to set.
|
||||
*/
|
||||
virtual void SetUserGeneralMessages(const std::vector<Message>& messages) = 0;
|
||||
|
||||
/**
|
||||
* @brief Gets the groups that are defined in the loaded metadata lists.
|
||||
* @param includeUserMetadata
|
||||
|
||||
@@ -105,6 +105,15 @@ std::vector<Message> Database::GetUserGeneralMessages(
|
||||
}
|
||||
}
|
||||
|
||||
void Database::SetUserGeneralMessages(const std::vector<Message>& messages) {
|
||||
try {
|
||||
database_->set_user_general_messages(
|
||||
convert<loot::rust::Message>(messages));
|
||||
} catch (const ::rust::Error& e) {
|
||||
std::rethrow_exception(mapError(e));
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<Group> Database::GetGroups(bool includeUserMetadata) const {
|
||||
try {
|
||||
return convert<Group>(database_->groups(includeUserMetadata));
|
||||
|
||||
@@ -41,6 +41,8 @@ public:
|
||||
std::vector<Message> GetUserGeneralMessages(
|
||||
bool evaluateConditions = false) const override;
|
||||
|
||||
void SetUserGeneralMessages(const std::vector<Message>& messages) override;
|
||||
|
||||
std::vector<Group> GetGroups(bool includeUserMetadata = true) const override;
|
||||
std::vector<Group> GetUserGroups() const override;
|
||||
void SetUserGroups(const std::vector<Group>& groups) override;
|
||||
|
||||
@@ -158,6 +158,22 @@ impl Database {
|
||||
.collect())
|
||||
}
|
||||
|
||||
#[expect(
|
||||
clippy::vec_box,
|
||||
reason = "Message is an opaque type to C++ so needs to be held in a Box."
|
||||
)]
|
||||
pub fn set_user_general_messages(
|
||||
&self,
|
||||
messages: Vec<Box<Message>>,
|
||||
) -> Result<(), VerboseError> {
|
||||
self.0
|
||||
.write()
|
||||
.map_err(DatabaseLockPoisonError::from)?
|
||||
.set_user_general_messages(to_vec_of_unwrapped(messages));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn groups(&self, include_user_metadata: bool) -> Result<Vec<Group>, VerboseError> {
|
||||
Ok(self
|
||||
.0
|
||||
|
||||
@@ -278,6 +278,8 @@ mod ffi {
|
||||
|
||||
pub fn user_general_messages(&self, evaluate_conditions: bool) -> Result<Vec<Message>>;
|
||||
|
||||
pub fn set_user_general_messages(&self, messages: Vec<Box<Message>>) -> Result<()>;
|
||||
|
||||
pub fn groups(&self, include_user_metadata: bool) -> Result<Vec<Group>>;
|
||||
|
||||
pub fn user_groups(&self) -> Result<Vec<Group>>;
|
||||
|
||||
@@ -581,6 +581,24 @@ TEST_P(DatabaseInterfaceTest,
|
||||
EXPECT_EQ(expectedMessages, messages);
|
||||
}
|
||||
|
||||
TEST_P(DatabaseInterfaceTest,
|
||||
setUserGeneralMessagesShouldReplaceExistingUserGeneralMessages) {
|
||||
ASSERT_NO_THROW(GenerateMasterlist());
|
||||
ASSERT_NO_THROW(GenerateUserlist());
|
||||
ASSERT_NO_THROW(handle_->GetDatabase().LoadMasterlist(masterlistPath));
|
||||
ASSERT_NO_THROW(handle_->GetDatabase().LoadUserlist(userlistPath_));
|
||||
|
||||
std::vector<Message> replacementMessages({
|
||||
Message(MessageType::say, "A replacement message"),
|
||||
});
|
||||
|
||||
handle_->GetDatabase().SetUserGeneralMessages(replacementMessages);
|
||||
|
||||
auto messages = handle_->GetDatabase().GetUserGeneralMessages();
|
||||
|
||||
EXPECT_EQ(replacementMessages, messages);
|
||||
}
|
||||
|
||||
TEST_P(DatabaseInterfaceTest,
|
||||
getPluginMetadataShouldReturnAnEmptyOptionalIfThePluginHasNoMetadata) {
|
||||
EXPECT_FALSE(handle_->GetDatabase().GetPluginMetadata(blankEsm));
|
||||
|
||||
@@ -196,6 +196,16 @@ impl Database {
|
||||
.map_err(Into::into)
|
||||
}
|
||||
|
||||
#[napi]
|
||||
pub fn set_user_general_messages(&self, messages: Vec<&Message>) -> Result<(), VerboseError> {
|
||||
self.0
|
||||
.write()
|
||||
.map_err(DatabaseLockPoisonError::from)?
|
||||
.set_user_general_messages(messages.into_iter().cloned().map(Into::into).collect());
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[napi]
|
||||
pub fn groups(&self, include_user_metadata: MergeMode) -> Result<Vec<Group>, VerboseError> {
|
||||
Ok(self
|
||||
|
||||
@@ -160,6 +160,15 @@ impl Database {
|
||||
.map_err(Into::into)
|
||||
}
|
||||
|
||||
pub fn set_user_general_messages(&self, messages: Vec<Message>) -> Result<(), VerboseError> {
|
||||
self.0
|
||||
.write()
|
||||
.map_err(DatabaseLockPoisonError::from)?
|
||||
.set_user_general_messages(messages.into_iter().map(Into::into).collect());
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn groups(&self, include_user_metadata: bool) -> Result<Vec<Group>, VerboseError> {
|
||||
Ok(self
|
||||
.0
|
||||
|
||||
@@ -216,6 +216,12 @@ impl Database {
|
||||
)
|
||||
}
|
||||
|
||||
/// Sets the general messages to store in the userlist, replacing any
|
||||
/// existing values stored there.
|
||||
pub fn set_user_general_messages(&mut self, general_messages: Vec<Message>) {
|
||||
self.userlist.set_messages(general_messages);
|
||||
}
|
||||
|
||||
/// Gets the groups that are defined in the loaded metadata lists.
|
||||
pub fn groups(&self, include_user_metadata: MergeMode) -> Vec<Group> {
|
||||
if include_user_metadata == MergeMode::WithUserMetadata {
|
||||
@@ -1110,6 +1116,32 @@ plugins:
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_user_general_messages_should_replace_existing_user_general_messages() {
|
||||
let fixture = Fixture::new(GameType::Oblivion);
|
||||
let mut database = fixture.database();
|
||||
|
||||
let userlist_path = fixture.inner.local_path.join("userlist.yaml");
|
||||
std::fs::write(
|
||||
&userlist_path,
|
||||
"globals: [{type: say, content: 'A user message'}]",
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
database.load_userlist(&userlist_path).unwrap();
|
||||
|
||||
let message = Message::new(MessageType::Say, "replacement message".to_owned());
|
||||
database.set_user_general_messages(vec![message.clone()]);
|
||||
|
||||
assert_eq!(
|
||||
&[message],
|
||||
database
|
||||
.user_general_messages(EvalMode::DoNotEvaluate)
|
||||
.unwrap()
|
||||
.as_slice()
|
||||
);
|
||||
}
|
||||
|
||||
mod groups {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -327,6 +327,10 @@ impl MetadataDocument {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn set_messages(&mut self, messages: Vec<Message>) {
|
||||
self.messages = messages;
|
||||
}
|
||||
|
||||
pub(crate) fn set_plugin_metadata(&mut self, plugin_metadata: PluginMetadata) {
|
||||
if plugin_metadata.is_regex_plugin() {
|
||||
self.regex_plugins.push(plugin_metadata);
|
||||
|
||||
Reference in New Issue
Block a user