| Crates.io | s3uri |
| lib.rs | s3uri |
| version | 1.0.0-beta.9 |
| created_at | 2025-04-25 15:45:49.340711+00 |
| updated_at | 2025-06-17 14:47:08.59991+00 |
| description | AWS S3 URIs |
| homepage | |
| repository | https://github.com/cariad/s3uri |
| max_upload_size | |
| id | 1649166 |
| size | 20,338 |
s3uri is a Rust library with structs and functions for building and parsing Amazon Web Services S3 URIs.
cargo add s3uri
s3uri::from_uri parses a string URI and returns a s3uri::S3Uri struct with the bucket name and key set.
let uri = s3uri::from_uri("s3://circus/images/clowns.jpg").unwrap();
assert_eq!(uri.bucket, "circus");
assert!(uri.key.is_some_and(|k| k == "images/clowns.jpg"));
To create a new URI from scratch, pass the bucket name to s3uri::from_bucket to get a s3uri::S3Uri struct.
let uri = s3uri::from_bucket("circus");
assert_eq!(uri, "s3://circus/");
assert_eq!(uri.bucket, "circus");
assert!(uri.key.is_none());
Call s3uri::S3Uri::join() to build up the key. Separators will be normalised and added between each segment as-needed.
let images_prefix = s3uri::from_bucket("circus")
.join("images/");
assert_eq!(images_prefix, "s3://circus/images/");
let clowns_uri = images_prefix
.join("staff")
.join("clowns.jpg");
assert_eq!(clowns_uri, "s3://circus/images/staff/clowns.jpg");
Call s3uri::S3Key::is_prefix() to check if a key is a prefix (i.e. ends with a /) or not.
let images_uri = s3uri::from_bucket("circus")
.join("images/");
assert!(images_uri.is_prefix());
let clowns_uri = images_uri.join("clowns.jpg");
assert!(!clowns_uri.is_prefix());
Call s3uri::S3Key::leaf() to get the segment of the key after the final separator.
let images_uri = s3uri::from_bucket("circus")
.join("images/");
assert_eq!(images_uri.leaf(), Some("images/"));
let clowns_uri = images_uri
.join("staff")
.join("clowns.jpg");
assert_eq!(clowns_uri.leaf(), Some("clowns.jpg"));
Hello! 👋 I'm Cariad Eccleston. You can find me at cariad.earth, github.com/cariad, linkedin.com/in/cariad and @cariad.earth on Bluesky.