# Azure DevOps Rust API
## Overview
`azure_devops_rust_api` implements a Rust interface to the Azure DevOps REST API (version 7.1).
The crate is autogenerated from the [Azure DevOps OpenAPI spec](https://github.com/MicrosoftDocs/vsts-rest-api-specs).
The crate contains [38 modules](https://docs.rs/azure_devops_rust_api/latest/azure_devops_rust_api/#modules)
## Usage
### Usage overview
The crate has many features/modules, but the general approach is similar for all:
- Obtain an authentication credential
- See [examples](examples/utils/mod.rs) for how to do this using the `azure_identity` crate
- Create a client for the feature/module that you want to use
- Normally you need to create a client for the top-level module that you want to use,
(e.g. `git_client`), and then one for the submodule (e.g. `repositories_client`).
- Use the client to make operation requests
- Each operation has zero or more mandatory parameters and zero or more optional parameters.
Mandatory parameters are passed as parameters on the operation request method. Optional
parameters may be provided by calling methods on the "builder" object returned by the
operation request method. The builder object is finalized by invoking `await`, which transforms
the builder into a Future (via the `IntoFuture` trait) and awaits the response.
### Code example
Example usage (from [examples/git_repo_list.rs](examples/git_repo_list.rs)):
```rust
// Get authentication credential either from a PAT ("ADO_TOKEN")
// or via the az cli.
let credential = utils::get_credential()
// Get ADO configuration via environment variables
let organization = env::var("ADO_ORGANIZATION")
.expect("Must define ADO_ORGANIZATION");
let project = env::var("ADO_PROJECT")
.expect("Must define ADO_PROJECT");
// Create a git client
let git_client = git::ClientBuilder::new(credential).build();
// Get all repositories in the specified organization/project
let repos = git_client
.repositories_client()
.list(organization, project)
.await?
.value;
// Output repo names
for repo in repos.iter() {
println!("{}", repo.name);
}
println!("{} repos found", repos.len());
```
[Individual modules in the API](https://docs.rs/azure_devops_rust_api/latest/azure_devops_rust_api/#modules) are enabled via Rust [`features`](https://doc.rust-lang.org/cargo/reference/features.html).
See the `features` section of [Cargo.toml](Cargo.toml) for the full list of features.
Example application `Cargo.toml` dependency spec showing how to specify desired features:
```toml
[dependencies]
...
azure_devops_rust_api = { version = "0.28.0", features = ["git", "pipelines"] }
```
## Examples
See [examples](examples/) directory.
Define environment variables:
```sh
export ADO_ORGANIZATION=<organization-name>
export ADO_PROJECT=<project-name>
```
To run the examples you need to provide authentication credentials either via:
- The `az` CLI, where you just need to have authenticated by running `az login` before running the examples.
- A [Personal Access Token (PAT)](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate), provided via the environment variable `ADO_TOKEN`
> Note: A personal access token contains your security credentials for Azure DevOps.
> A PAT identifies you, your accessible organizations, and scopes of access.
> As such, they're as critical as passwords, so you should treat them the same way.
> When creating a PAT only grant it the minimum required scopes, and set the expiry time to be short.
Run the example via `cargo run --example`. You will need to enable the features required
by the example. If you don't specify the necessary features you do get a helpful error
message.
Example:
```sh
cargo run --example git_repo_get --features="git" <repo-name>
```
## Issue reporting
If you find any issues then please raise them via [Github](https://github.com/microsoft/azure-devops-rust-api/issues).
## Useful links
- [Azure DevOps REST API Reference](https://docs.microsoft.com/en-us/rest/api/azure/devops/)
- [vsts-rest-api-specs](https://github.com/MicrosoftDocs/vsts-rest-api-specs)