macro_rules! implement_setters {
(
$self:tt ;
$( $mandatory_field_name:ident: $mandatory_field_type:ty ),* ;
$( $optional_field_name:ident: $optional_field_type:ty ),*
) => {
$(
pub fn $mandatory_field_name(&mut $self, value: &$mandatory_field_type) -> &mut Self
{
$self.$mandatory_field_name = value.clone();
$self
}
)*
$(
pub fn $optional_field_name(&mut $self, value: &$optional_field_type) -> &mut Self
{
$self.$optional_field_name = Some(value.clone());
$self
}
)*
}
}
macro_rules! implement_perform {
(
$self:tt, $struct_type:ty, $method_name:expr ;
$( $mandatory_field_name:ident: $mandatory_field_type:ty ),* ;
$( $optional_field_name:ident: $optional_field_type:ty ),*
) => {
pub fn perform(&'a mut $self) -> Result<$struct_type, FlickrError> {
let mut p: BTreeMap<&str, String> = BTreeMap::new();
$(
p.insert(stringify!($mandatory_field_name), $self.$mandatory_field_name.to_string().clone());
)*
$(
if let Some(ref value) = $self.$optional_field_name {
p.insert(stringify!($optional_field_name), value.to_string().clone());
}
)*
let content = $self.flickr.call_method($method_name, p)?;
debug!("content: {}", content);
let r: $struct_type = serde_json::from_str(&content)?;
debug!("de: {:#?}", r);
return Ok(r);
}
}
}