use futures::future::Future;
use serde::{Serialize, Deserialize};
use crate::client::Client;
use crate::error::Error;
use crate::i18n::I18n;
use crate::image::Image;
use crate::pagination::Page;
use crate::params;
use crate::tag::Tag;
#[derive(Debug, Serialize, Deserialize)]
pub struct Project {
pub absolute_url: String,
pub amount_raised: u64,
pub country: String,
pub currency: String,
pub date_end: String,
pub date_start: String,
pub finished: bool,
pub goal: u64,
pub id: u64,
pub lang: String,
pub name: I18n,
pub nb_products_sold: u64,
pub slug: String,
pub subtitle: I18n,
#[serde(alias = "type")]
pub kind: String,
pub main_image: Option<Image>,
pub main_tag: Option<Tag>,
pub owner: Option<User>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Projects {
pub projects: Vec<Project>,
pub meta: Page
}
#[derive(Debug, Serialize, Deserialize)]
pub struct User {
pub absolute_url: String,
pub first_name: String,
pub id: u64,
pub last_name: String,
pub name: String,
pub screenname: String,
pub username: String,
}
pub fn projects(client: &Client, params: Option<impl Into<String>>) -> impl Future<Item=Projects, Error=Error> {
client.get("/v1/search/projects", params)
}
pub type Params = params::Params;
impl Params {
pub fn with_langs(self, langs: Vec<String>) -> Params {
self.add_query("langs", langs.join(","))
}
pub fn with_countries(self, countries: Vec<String>) -> Params {
self.add_query("countries", countries.join(","))
}
pub fn with_partners(self, partners: Vec<String>) -> Params {
self.add_query("partners", partners.join(","))
}
pub fn with_selected_ids(self, ids: Vec<u64>) -> Params {
let selected: Vec<String> = ids.iter().map(|i| i.to_string()).collect();
self.add_query("selected_ids", selected.join(","))
}
pub fn with_term(self, term: impl Into<String>) -> Params {
self.add_query(term, "")
}
pub fn with_query_sort(self, sort: String) -> Params {
self.add_query("sort", sort)
}
pub fn with_tag_id(self, id: u64) -> Params {
self.add_query("tag_id", id.to_string())
}
pub fn with_owner_id(self, id: u64) -> Params {
self.add_query("owner_id", id.to_string())
}
pub fn with_city_id(self, id: u64) -> Params {
self.add_query("city_id", id.to_string())
}
pub fn with_region_id(self, id: u64) -> Params {
self.add_query("region_id", id.to_string())
}
}
#[cfg(test)]
mod tests {
#[test]
fn with_selected_ids() {
use super::Params;
let p = Params::new().with_selected_ids(vec![42, 1337]);
assert_eq!(p.to_string(), "?q=selected_ids:42,1337");
}
}