#[macro_use] extern crate anterofit;
#[macro_use] extern crate serde_derive;
use anterofit::{Adapter, Url};
#[derive(Debug, Deserialize)]
struct Post {
pub userid: Option<u64>,
pub id: u64,
pub title: String,
pub body: String
}
#[derive(Debug, Serialize)]
struct NewPost<'a> {
pub userid: u64,
pub title: &'a str,
pub body: &'a str,
}
service! {
trait PostService {
fn get_post(&self, id: u64) -> Post {
GET("/posts/{}", id)
}
fn get_posts(&self) -> Vec<Post> {
GET("/posts")
}
fn posts_by_user(&self, userid: u64) -> Vec<Post> {
GET("/user/{}/posts", userid)
}
fn new_post(&self, userid: u64, title: &str, body: &str) -> Post {
POST("/posts/");
body!(EAGER: NewPost {
userid: userid,
title: title,
body: body
})
}
}
}
unsizeable!(PostService);
fn main() {
let url = Url::parse("https://jsonplaceholder.typicode.com").unwrap();
let adapter = Adapter::builder()
.base_url(url)
.serialize_json()
.build();
let service = adapter.arc_service::<PostService>();
create_post(&adapter);
fetch_posts(&adapter);
user_posts(&*service);
}
fn create_post<P: PostService>(post_service: &P) {
let post = post_service.new_post(42, "Hello", "World!")
.exec().block()
.unwrap();
println!("Created post: {:?}", post);
}
fn fetch_posts(post_service: &PostService) {
let posts = post_service.get_posts()
.exec_here()
.unwrap();
for post in posts.into_iter().take(3) {
println!("Fetched post: {:?}", post);
}
}
fn user_posts(post_service: &PostService) {
post_service.posts_by_user(1)
.on_complete(|posts| for post in posts { println!("User post: {:?}", post); })
.exec().ignore();
}