Crate aws-arn

Provides the types, builders, and other helpers to manipulate AWS Amazon Resource Name (ARN) strings.

MIT License Minimum Rust Version crates.io docs.rs Build Audit GitHub stars

The ARN is a key component of all AWS service APIs and yet nearly all client toolkits treat it simply as a string. While this may be a reasonable and expedient decision, it seems there might be a need to not only ensure correctness of ARNs with validators but also constructors that allow making these strings correclt in the first place.

ARN Types

This crate provides a number of levels of ARN manipulation, the first is the direct construction of an ARN type using the core ResourceName, Identifier, AccountIdentifier, and ResourceIdentifier types.

```rust use awsarn::{ResourceName, ResourceIdentifier}; use awsarn::known::{Partition, Service}; use std::str::FromStr;

let arn = ResourceName { partition: Some(Partition::default().into()), service: Service::S3.into(), region: None, accountid: None, resource: ResourceIdentifier::fromstr("mythings/thing-1").unwrap() }; ```

In the example above, as we are defining a minimal ResourceName we could use one of the defined constructor functions.

```rust use awsarn::{ResourceName, ResourceIdentifier}; use awsarn::known::Service; use std::str::FromStr;

let arn = ResourceName::aws( Service::S3.into(), ResourceIdentifier::from_str("mythings/thing-1").unwrap() ); ```

Alternatively, using FromStr, you can parse an existing ARN string into an ARN value.

```rust use aws_arn::ResourceName; use std::str::FromStr;

let arn: ResourceName = "arn:aws:s3:::mythings/thing-1" .parse() .expect("didn't look like an ResourceName"); ```

Another approach is to use a more readable builder which also allows you to ignore those fields in the ARN you don't always need and uses a more fluent style of ARN construction.

```rust 45Muse awsarn::builder::{ArnBuilder, ResourceBuilder}; use awsarn::known::{Partition, Service}; use aws_arn::{ResourceName, Identifier}; use std::str::FromStr;

let arn: ResourceName = ArnBuilder::serviceid(Service::S3.into()) .resource(ResourceBuilder::named(Identifier::fromstr("mythings").unwrap()) .resourcename(Identifier::newunchecked("my-layer")) .buildresourcepath()) .inpartitionid(Partition::Aws.into()) .into(); ```

Finally, it is possible to use resource-type specific functions that allow an even more direct and simple construction (module aws_arn::builder::{service} - service builder functions, although at this time there are few supported services.

```rust use awsarn::builder::s3; use awsarn::Identifier; use std::str::FromStr;

let arn = s3::object( Identifier::fromstr("mythings").unwrap(), Identifier::fromstr("thing-1").unwrap(), ); ```

For more, see the AWS documentation for Amazon Resource Name (ARN) documentation.

Optional Features

This crate has attempted to be as lean as possible, with a really minimal set of dependencies, we have include the following capabilities as optional features.

Changes

Version 0.3.0

Version 0.2.1

Version 0.2.0

Version 0.1.1

Version 0.1.0

TODO