gitlab-api 0.6.0

Wrapper for GitLab API v3
# gitlab-api-rs

Rust wrapper to the GitLab API.

[![Crates.io](https://img.shields.io/crates/v/gitlab-api.svg)](https://crates.io/crates/gitlab-api)
[![Build Status](https://travis-ci.org/nbigaouette/gitlab-api-rs.svg?branch=master)](https://travis-ci.org/nbigaouette/gitlab-api-rs)
[![Documentation](https://docs.rs/gitlab-api/badge.svg)](https://docs.rs/gitlab-api)
[![License](https://img.shields.io/crates/l/gitlab-api.svg)](#licensing)
[![Coverage Status](https://coveralls.io/repos/github/nbigaouette/gitlab-api-rs/badge.svg?branch=master)](https://coveralls.io/github/nbigaouette/gitlab-api-rs?branch=master)
[![Codecov](https://img.shields.io/codecov/c/github/nbigaouette/gitlab-api-rs/master.svg?style=flat)](https://codecov.io/github/nbigaouette/gitlab-api-rs?branch=master)


**NOTE**: Requires Rust 1.15 (stable) since this crate is using custom derive for Serde.

## Synopsis

[GitLab](https://about.gitlab.com/) is an amazing tool. For most of the tasks, the web UI is more than enough but for some tasks nothing beats scripting them. The [GitLab API](https://docs.gitlab.com/ce/api/) is there to allow scripting actions on the GitLab server.

The excellent [python-gitlab](https://github.com/gpocentek/python-gitlab) allows to use the API from Python, but when playing with it I find myself missing [Rust](https://www.rust-lang.org/)'s static typing. Hence this implementation in Rust.

The (v3) API is quite long, so the parts I need will be implemented first.


## What Works

* Read-only listing:
    * Groups;
    * Issues;
    * Merge Requests;
    * Projects (admin all, user's, specific id, owned, search);


## What Doesn't Work

* Any _write_ commands (`POST`, `PUT`, etc.)
* Any _Enterprise Edition_-specific features.
* API elements using arrays.

    For example [listing merge requests, filtering  with multiple `iid`s]https://docs.gitlab.com/ce/api/merge_requests.html#list-merge-requests:

    ```
    GET /projects/:id/merge_requests?iid[]=42&iid[]=43
    ```
* Some projects listing:
    * branch;
    * branches;
    * events;
    * hook;
    * hooks;
    * starred;
    * visible;


## Usage


```
[dependencies]
gitlab-api = "0.6"
```

This crate uses a builder pattern to add filters to a query. Once the query is built, `list()` will commit it by contacting the GitLab server and performing the request.

```
extern crate gitlab_api as gitlab;

fn main() {
    let gl = gitlab::GitLab::new(&"gitlab.com", &"GITLAB_TOKEN_XXXXXXX").unwrap();

    // Get GitLab's version.
    let gitlab_version = gl.version().unwrap();
    println!("gitlab_version: {:?}", gitlab_version);


    // Low level methods

    // Get projects, owned by authenticated user and which are archived.
    let projects = gl.projects().owned().archived(true).list().unwrap();
    println!("projects: {:?}", projects);

    // Get groups owned by authenticated user.
    let owned_groups = gl.groups().owned().list().unwrap();
    println!("owned_groups: {:?}", owned_groups);

    // Get closed issues.
    let closed_issues = gl.issues().state(gitlab::issues::State::Closed).list().unwrap();
    println!("closed_issues: {:?}", closed_issues);


    // Higher level methods

    // Get a specific project
    let project = gl.get_project("nbigaouette1", "gitlab-api-rs").chain_err(|| "cannot get project")?;

    // Get a specific issue
    let issue = gl.get_issue("nbigaouette1", "gitlab-api-rs", 1).chain_err(|| "cannot get issue")?;

    // Get a specific merge request
    let merge_request = gl.get_merge_request("nbigaouette1", "gitlab-api-rs", 1).chain_err(|| "cannot get merge_request")?;
}
```

**NOTES**:
* Crate uses `https` by default. Use `GitLab::new_insecure()` to use `http` (or `port()` and `sheme()` setters on `GitLab` struct).
* Sending your token in clear over `http` is dangerous!
* See [examples/list_projects.rs] for an example of how to load the token (and the hostname) from an environment variable.
* See the `examples` directory for many more examples on how to use this crate.


## Dependencies

Thanks `cargo-graph` for the graph!

![Dependencies](gitlab-api-rs.png)


## Licensing

gitlab-api-rs is distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See [LICENSE-APACHE](./LICENSE-APACHE) and [LICENSE-MIT](./LICENSE-MIT) for details.