use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "kebab-case")]
pub enum BrowserPersonaPreset {
#[default]
ChromeStable,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct PersonaSeed(String);
impl PersonaSeed {
pub fn new(value: impl Into<String>) -> Self {
let value = value.into();
if value.trim().is_empty() {
return Self::from_stable_input("empty");
}
Self(value)
}
pub fn from_stable_input(input: impl AsRef<str>) -> Self {
let mut hash = 0xcbf2_9ce4_8422_2325u64;
for byte in input.as_ref().as_bytes() {
hash ^= u64::from(*byte);
hash = hash.wrapping_mul(0x0000_0100_0000_01b3);
}
Self(format!("{hash:016x}"))
}
pub fn as_str(&self) -> &str {
&self.0
}
}
impl fmt::Display for PersonaSeed {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(&self.0)
}
}