Compare commits

...

4 commits

Author SHA1 Message Date
Ben Aaron Goldberg 63dd63c230 Impl select_pronouns and add parse_prefstring to InstanceSettings
Signed-off-by: Ben Aaron Goldberg <ben@benaaron.dev>
2021-10-23 20:33:12 -04:00
Ben Aaron Goldberg 71e979e023 Add the select_pronoun method to UserPreferencesV0 & impl Default for UserPreferences
Signed-off-by: Ben Aaron Goldberg <ben@benaaron.dev>
2021-10-23 20:31:45 -04:00
Ben Aaron Goldberg a927e9010b Impl into_prefstring_bytes for UserPreferencesV0
Signed-off-by: Ben Aaron Goldberg <ben@benaaron.dev>
2021-10-23 20:30:48 -04:00
Ben Aaron Goldberg 2233cf5a15 Fix typo in user pref spec
Signed-off-by: Ben Aaron Goldberg <ben@benaaron.dev>
2021-10-23 20:30:06 -04:00
4 changed files with 59 additions and 6 deletions

View file

@ -10,7 +10,7 @@ contents := version-0 | ...
If user-preferences is not present (i.e. is zero-length), then the default preferences If user-preferences is not present (i.e. is zero-length), then the default preferences
should be assumed. Default preferences will be set by the instance operator should be assumed. Default preferences will be set by the instance operator
version-1 := variant-0-0 version-0 := variant-0-0
variant-0-0 := default-enabled default-weight *command variant-0-0 := default-enabled default-weight *command
default-enabled := 1 bit default-enabled := 1 bit

View file

@ -46,6 +46,7 @@ use std::fmt;
use serde::{Serialize, Deserialize, self}; use serde::{Serialize, Deserialize, self};
use user_preferences::{ParseError, Preference};
pub use weighted_table::WeightedTable; pub use weighted_table::WeightedTable;
pub use user_preferences::UserPreferences; pub use user_preferences::UserPreferences;
@ -73,15 +74,21 @@ impl InstanceSettings {
/// ``` /// ```
/// # use pronouns_today::InstanceSettings; /// # use pronouns_today::InstanceSettings;
/// # let settings = InstanceSettings::default(); /// # let settings = InstanceSettings::default();
/// # let name = String::from("Sashanora"); /// # let name = String::from("Sashanoraa");
/// # let prefstring = String::from("todo"); /// # let prefstring = String::from("todo");
/// let pronouns = settings.parse_prefstring(Some(&prefstring)).select_pronouns(Some(&name)); /// let pronouns = InstanceSettings::parse_prefstring(Some(&prefstring))?.select_pronouns(&settings, Some(&name));
/// # assert_eq!(pronouns, settings.select_pronouns(Some(&name), Some(&prefstring))); /// # assert_eq!(pronouns, settings.select_pronouns(Some(&name), Some(&prefstring)));
/// ``` /// ```
pub fn select_pronouns(&self, name: Option<impl AsRef<str>>, pref_string: Option<impl AsRef<str>>) -> &str { pub fn select_pronouns(&self, name: Option<&str>, pref_string: Option<&str>) -> Result<&Pronoun, ParseError> {
todo!() Self::parse_prefstring(pref_string)?.select_pronoun(&self, name)
} }
pub fn parse_prefstring(pref_string: Option<&str>) -> Result<UserPreferences, ParseError> {
match pref_string {
Some(pref_string) => UserPreferences::from_prefstring(pref_string),
None => Ok(UserPreferences::default())
}
}
} }
impl Default for InstanceSettings { impl Default for InstanceSettings {

View file

@ -29,6 +29,12 @@ pub enum UserPreferences {
V0(v0::UserPreferencesV0) V0(v0::UserPreferencesV0)
} }
impl Default for UserPreferences {
fn default() -> Self {
UserPreferences::V0(UserPreferencesV0::default())
}
}
/// Functionality provided by any version of user preferences /// Functionality provided by any version of user preferences
/// ///
/// See also: [`UserPreferences`] /// See also: [`UserPreferences`]
@ -76,6 +82,14 @@ pub trait Preference {
fn into_prefstring(&self) -> String { fn into_prefstring(&self) -> String {
BASE32_NOPAD.encode(&self.into_prefstring_bytes()) BASE32_NOPAD.encode(&self.into_prefstring_bytes())
} }
fn select_pronoun<'a>(&self, settings: &'a InstanceSettings, name: Option<&str>) -> Result<&'a Pronoun, ParseError> {
let seed = match name {
Some(name) => name.as_bytes(),
None => &[],
};
Ok(self.into_weighted_table(settings)?.select_today(seed))
}
} }
impl Preference for UserPreferences { impl Preference for UserPreferences {

View file

@ -119,7 +119,27 @@ impl Preference for UserPreferencesV0 {
} }
fn into_prefstring_bytes(&self) -> Vec<u8> { fn into_prefstring_bytes(&self) -> Vec<u8> {
todo!() let mut defaults_byte = 0u8;
if self.default_enabled {
defaults_byte |= 0b10000000;
}
defaults_byte |= self.default_weight & 0b01111111;
vec![defaults_byte]
.into_iter()
.chain(self.commands.iter().map(|cmd| cmd.into()))
.collect()
}
}
/// Default to all pronouns on with equal weight
/// TODO make this configurable
impl Default for UserPreferencesV0 {
fn default() -> Self {
Self {
default_enabled: true,
default_weight: 1,
commands: vec![],
}
} }
} }
@ -166,6 +186,18 @@ impl From<u8> for Command {
} }
} }
impl From<&Command> for u8 {
fn from(command: &Command) -> Self {
match command {
// Some these ands shouldn't be needed if the command is valid
Command::SetWeight(weight) => weight & 0b01111111,
Command::Move { toggle_enabled, distance } => {
0b10000000 | ((*toggle_enabled as u8) << 6) | (distance & 0b00111111)
}
}
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {