use std::collections::BTreeMap;
use std::hash::{BuildHasher, Hasher};
use crate::records::JsonValue;
pub fn seeded(payload: &JsonValue) -> JsonValue {
let Some(mut fields) = seedable_fields(payload) else {
return payload.clone();
};
if let Some(seed) = fields.get("seed")
&& *seed != JsonValue::Null
{
return JsonValue::Object(fields);
}
fields.insert("seed".to_owned(), JsonValue::Int(random_seed()));
JsonValue::Object(fields)
}
pub fn reseeded(params: &JsonValue) -> JsonValue {
let Some(mut fields) = seedable_fields(params) else {
return params.clone();
};
let previous = fields.get("seed").cloned();
let mut fresh = JsonValue::Int(random_seed());
while Some(&fresh) == previous.as_ref() {
fresh = JsonValue::Int(random_seed());
}
fields.insert("seed".to_owned(), fresh);
JsonValue::Object(fields)
}
fn seedable_fields(payload: &JsonValue) -> Option<BTreeMap<String, JsonValue>> {
match payload {
JsonValue::Object(fields) => Some(fields.clone()),
JsonValue::Null => Some(BTreeMap::new()),
_ => None,
}
}
fn random_seed() -> i64 {
let entropy = std::collections::hash_map::RandomState::new()
.build_hasher()
.finish();
(entropy % u32::MAX as u64) as i64
}