| Crates.io | s3-bucket |
| lib.rs | s3-bucket |
| version | 0.2.1 |
| created_at | 2026-01-10 06:56:16.409095+00 |
| updated_at | 2026-01-10 06:56:16.409095+00 |
| description | A rust wrapper around aws-sdk-s3 |
| homepage | |
| repository | https://github.com/Salman-Sali/s3-bucket |
| max_upload_size | |
| id | 2033648 |
| size | 75,378 |
This is a work in progress project.
[dependencies]
s3-bucket = { git = "https://github.com/Salman-Sali/s3-bucket.git", tag = "0.2.1" }
Below example is for a build release. Refer examples/file_and_json/src/json_insert_update.rs for json example.
use s3_bucket::{traits::has_key::HasKey, S3BucketItem, S3Context};
use strum::{Display, EnumString};
pub async fn test(s3_context: S3Context) {
let new_build = MyAppBuild {
target_os: TargetOs::Windows,
target_arch: TargetArch::X86_64,
version: "0.1.0".into(),
name: "my-app.exe".into(),
file: File::FilePath("/home/myuser/build_folder/my-app.exe".into()),
};
let key = new_build.get_key();
let _ = s3_context.put(new_build).await;
let my_build = s3_context.get::<MyAppBuild>(key).await;
}
#[derive(Clone, S3BucketItem)]
#[s3_item_prop(bucket = get_bucket_name())]
#[s3_item_prop(key = "my-app-builds/{target_os}/{target_arch}/{version}/{name}")]
#[s3_item_prop(content_type = "application/octet-stream")]
pub struct MyAppBuild {
pub target_os: TargetOs,
pub target_arch: TargetArch,
pub version: String,
pub name: String,
pub file: File,
}
#[derive(Display, EnumString, Clone)]
pub enum TargetOs {
Windows,
Linux,
}
#[derive(Display, EnumString, Clone)]
pub enum TargetArch {
X86_64,
ARM64,
}
#[derive(Clone)]
pub enum File {
FilePath(String),
FileContent(s3_bucket::bytes::Bytes),
}
pub fn get_bucket_name() -> String {
String::from("MyBucket")
}
impl TryInto<s3_bucket::bytes::Bytes> for MyAppBuild {
type Error = s3_bucket::error::Error;
fn try_into(self) -> Result<s3_bucket::bytes::Bytes, Self::Error> {
let content = match self.file {
File::FilePath(x) => {
let file_content =
std::fs::read(x).map_err(|_| s3_bucket::error::Error::TryIntoByteError)?;
s3_bucket::bytes::Bytes::from_owner(file_content)
}
File::FileContent(bytes) => bytes,
};
Ok(content)
}
}
impl TryFrom<s3_bucket::s3_object::S3Object> for MyAppBuild {
type Error = s3_bucket::error::Error;
fn try_from(value: s3_bucket::s3_object::S3Object) -> Result<Self, Self::Error> {
let mut parts = value.key.split('/');
let _prefix = parts.next();
let target_os = parts
.next()
.ok_or(s3_bucket::error::Error::Other("Parse error.".into()))?
.parse::<TargetOs>()
.map_err(|_| s3_bucket::error::Error::Other("Parse error.".into()))?;
let target_arch = parts
.next()
.ok_or(s3_bucket::error::Error::Other("Parse error.".into()))?
.parse::<TargetArch>()
.map_err(|_| s3_bucket::error::Error::Other("Parse error.".into()))?;
let version = parts
.next()
.ok_or(s3_bucket::error::Error::Other("Parse error.".into()))?
.to_string();
let name = parts
.next()
.ok_or(s3_bucket::error::Error::Other("Parse error.".into()))?
.to_string();
Ok(MyAppBuild {
target_os,
target_arch,
version,
name,
file: File::FileContent(value.bytes),
})
}
}