rrw 0.1.2

A crate to easily build clients for REST-APIs.
Documentation
use rrw::{
    authenticate::HeaderAuthenticator, Error, RestConfigBuilder, RestRequest, StandardRestError,
};
use rrw_macro::rest;
use serde::{Deserialize, Serialize};

#[derive(Serialize)]
struct SearchQuery {
    scope: String,
    search: String,
}

#[derive(Deserialize, Debug, PartialEq, Eq)]
struct Project {
    name: String,
    description: String,
}

#[rest]
impl GitLab {
    async fn search(&self, search: &SearchQuery) -> Result<Vec<Project>, Error<StandardRestError>> {
        RestRequest::<&SearchQuery, ()>::get("/search")
            .query(search)
            .authenticate()
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    env_logger::init();
    let authenticator = HeaderAuthenticator::new(
        "PRIVATE-TOKEN",
        std::env::var("GITLAB_TOKEN").expect("Environmental variable `GITLAB_TOKEN` needed."),
    );
    let gitlab = GitLab::new(
        RestConfigBuilder::new("https://gitlab.com/api/v4")
            .authenticator(authenticator)
            .build(),
    );
    let query = SearchQuery {
        scope: "projects".to_string(),
        search: "gitlab".to_string(),
    };

    let results = gitlab.search(&query).await?;

    for project in results {
        println!("{}: {}", project.name, project.description);
    }

    Ok(())
}