flickr 0.1.1

Rust binding to Flickr API
Documentation

use flickr_derive::{Builder};
use super::super::{FlickrError};

#[derive(Builder)]
#[method = "boat.search"]
#[result = "BoatQueryResult"]
struct BoatQuery<'a> {
      flickr: &'a mut DummyFlickr,
      kind: &'a str,
      class: Option<&'a str>,
      loa_min: Option<f64>,
      loa_max: Option<f64>,
      crew_min: i32,
      crew_max: i32,
}

#[derive(Deserialize)]
struct BoatQueryResult {
    method: String,
    kind: String,
    class: String,
}

struct DummyFlickr {
}

impl DummyFlickr {
    pub fn is_authenticated(&self) -> bool {
        true
    }
    pub fn do_auth(&self) -> Result<(), FlickrError> {
        Ok(())
    }
    pub fn call_method(&self, method: &str, params: std::collections::BTreeMap<&str, String>) -> Result<(String), FlickrError> {
        let s = format!("{{ \"method\": \"{}\", \"kind\": \"{}\", \"class\": \"{}\" }}", 
                        method, 
                        {
                            if params.contains_key("kind") {
                                params["kind"].clone()
                            } else {
                                "".into()
                            }
                        },
                        {
                            if params.contains_key("class") {
                                params["class"].clone()
                            } else {
                                "".into()
                            }
                        },
                        );
        Ok(s.into())
    }
}

#[test]
fn test_derive_builder() {
    let mut flickr = DummyFlickr{};
    let mut boat = BoatQuery::new(&mut flickr);

    boat
        .kind("sailing")
        .class("Ilur")
        .loa_min(4.00)
        .loa_max(5.00)
        .crew_min(1)
        .crew_max(5);

    assert_eq!(boat.kind, "sailing");
    assert_eq!(boat.class, Some("Ilur"));
    assert_eq!(boat.loa_min, Some(4.00));
    assert_eq!(boat.loa_max, Some(5.00));
    assert_eq!(boat.crew_min, 1);
    assert_eq!(boat.crew_max, 5);
    
    match boat.perform() {
        Ok(result) => {
            assert_eq!(result.method, "boat.search");
            assert_eq!(result.kind, "sailing");
            assert_eq!(result.class, "Ilur");
        },
        Err(e) => {
            assert_eq!("ok", e.to_string());
        }
    }
}