diff options
author | Paul Woolcock <paul@woolcock.us> | 2018-09-04 14:44:23 -0400 |
---|---|---|
committer | Paul Woolcock <paul@woolcock.us> | 2018-09-04 16:20:00 -0400 |
commit | 0ad1e3741ca8a2419433986da2e60395289ec5e9 (patch) | |
tree | b250f028f5541c96c54d17ea0028abf186eca6df /src | |
parent | 375e4af28676bb9733d45ed96dc87dd921685821 (diff) |
Allow the user to update their profile metadata fields
Closes #54
Diffstat (limited to 'src')
-rw-r--r-- | src/entities/account.rs | 40 | ||||
-rw-r--r-- | src/requests/update_credentials.rs | 36 |
2 files changed, 73 insertions, 3 deletions
diff --git a/src/entities/account.rs b/src/entities/account.rs index 2411c02..604f9fd 100644 --- a/src/entities/account.rs +++ b/src/entities/account.rs @@ -45,6 +45,26 @@ pub struct Account { /// If the owner decided to switch accounts, new account is in /// this attribute pub moved: Option<Box<Account>>, + /// List of profile metadata fields + pub fields: Option<Vec<MetadataField>>, + /// Boolean indicating whether this account is a bot or not + pub bot: Option<bool>, +} + +/// A single name: value pair from a user's profile +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)] +pub struct MetadataField { + name: String, + value: String, +} + +impl MetadataField { + pub(crate) fn new(name: &str, value: &str) -> MetadataField { + MetadataField { + name: name.into(), + value: value.into(), + } + } } /// An extra object given from `verify_credentials` giving defaults about a user @@ -54,6 +74,7 @@ pub struct Source { #[serde(deserialize_with = "string_or_bool")] sensitive: bool, note: String, + fields: Vec<MetadataField>, } fn string_or_bool<'de, D: Deserializer<'de>>(val: D) -> ::std::result::Result<bool, D::Error> { @@ -81,7 +102,7 @@ fn string_or_bool<'de, D: Deserializer<'de>>(val: D) -> ::std::result::Result<bo }) } -#[derive(Debug, Default, Clone, Copy, Serialize, PartialEq)] +#[derive(Debug, Default, Clone, Serialize, PartialEq)] pub(crate) struct UpdateSource { #[serde(skip_serializing_if = "Option::is_none")] pub(crate) privacy: Option<status_builder::Visibility>, @@ -101,4 +122,21 @@ pub(crate) struct Credentials { pub(crate) header: Option<PathBuf>, #[serde(skip_serializing_if = "Option::is_none")] pub(crate) source: Option<UpdateSource>, + #[serde(serialize_with = "fields_attributes_ser::ser")] + pub(crate) fields_attributes: Vec<MetadataField>, +} + +mod fields_attributes_ser { + use super::*; + use serde::ser::{SerializeMap, Serializer}; + pub(crate) fn ser<S>(attrs: &Vec<MetadataField>, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut map = serializer.serialize_map(Some(attrs.len()))?; + for (i, field) in attrs.iter().enumerate() { + map.serialize_entry(&i, &field)?; + } + map.end() + } } diff --git a/src/requests/update_credentials.rs b/src/requests/update_credentials.rs index d0e0fb8..7784cc3 100644 --- a/src/requests/update_credentials.rs +++ b/src/requests/update_credentials.rs @@ -3,7 +3,7 @@ use std::{ path::{Path, PathBuf}, }; -use entities::account::{Credentials, UpdateSource}; +use entities::account::{Credentials, MetadataField, UpdateSource}; use errors::Result; use status_builder; @@ -39,6 +39,7 @@ pub struct UpdateCredsRequest { note: Option<String>, avatar: Option<PathBuf>, header: Option<PathBuf>, + field_attributes: Vec<MetadataField>, // UpdateSource fields privacy: Option<status_builder::Visibility>, @@ -166,6 +167,23 @@ impl UpdateCredsRequest { self } + /// Add a metadata field + /// + /// # Example + /// + /// ``` + /// # extern crate elefren; + /// use elefren::UpdateCredsRequest; + /// + /// let mut builder = UpdateCredsRequest::new(); + /// + /// builder.field_attribute("some key", "some value"); + /// ``` + pub fn field_attribute(&mut self, name: &str, value: &str) -> &mut Self { + self.field_attributes.push(MetadataField::new(name, value)); + self + } + pub(crate) fn build(&mut self) -> Result<Credentials> { Ok(Credentials { display_name: self.display_name.clone(), @@ -176,6 +194,7 @@ impl UpdateCredsRequest { privacy: self.privacy.clone(), sensitive: self.sensitive.clone(), }), + fields_attributes: self.field_attributes.clone(), }) } } @@ -183,7 +202,7 @@ impl UpdateCredsRequest { #[cfg(test)] mod tests { use super::*; - use entities::account::{Credentials, UpdateSource}; + use entities::account::{Credentials, MetadataField, UpdateSource}; use status_builder::Visibility; #[test] @@ -276,6 +295,19 @@ mod tests { } #[test] + fn test_update_creds_request_field_attribute() { + let mut builder = UpdateCredsRequest::new(); + builder.field_attribute("foo", "bar"); + assert_eq!( + builder, + UpdateCredsRequest { + field_attributes: vec![MetadataField::new("foo", "bar")], + ..Default::default() + } + ); + } + + #[test] fn test_update_creds_request_build() { let mut builder = UpdateCredsRequest::new(); builder.display_name("test").note("a note"); |