use crate::basic::value::Value;
use crate::world_state::WorldState;
#[derive(Clone, Debug, PartialEq, Hash, Eq)]
pub enum Mutation {
Set(String, Value),
Delete(String),
Increment(String, Value),
Decrement(String, Value),
}
impl Mutation {
pub fn set(key: impl Into<String>, value: impl Into<Value>) -> Self {
Mutation::Set(key.into(), value.into())
}
pub fn delete(key: impl Into<String>) -> Self {
Mutation::Delete(key.into())
}
pub fn increment(key: impl Into<String>, value: impl Into<Value>) -> Self {
Mutation::Increment(key.into(), value.into())
}
pub fn decrement(key: impl Into<String>, value: impl Into<Value>) -> Self {
Mutation::Decrement(key.into(), value.into())
}
}
pub fn apply_mutator(world_state: &mut WorldState, mutator: &Mutation) {
match mutator {
Mutation::Set(key, value) => {
world_state.0.insert(key.into(), *value);
},
Mutation::Delete(key) => {
world_state.0.remove(key);
},
Mutation::Increment(key, value) => {
if let Some(current_value) = world_state.0.get_mut(key) {
*current_value += *value;
}
},
Mutation::Decrement(key, value) => {
if let Some(current_value) = world_state.0.get_mut(key) {
*current_value -= *value;
}
},
}
}
pub fn format_mutations(mutations: Vec<Mutation>) -> String {
let mut output = String::new();
for mutation in mutations {
match mutation {
Mutation::Set(k, v) => output.push_str(&format!("set: {k} = {v}\n")),
Mutation::Delete(k) => output.push_str(&format!("delete: {k}\n")),
Mutation::Increment(k, v) => output.push_str(&format!("increment: {k} + {v}\n")),
Mutation::Decrement(k, v) => output.push_str(&format!("decrement: {k} - {v}\n")),
}
}
output
}