use std::fmt;
pub type Result<T> = std::result::Result<T, ObjectStorageError>;
#[derive(Debug)]
pub struct ObjectStorageError(String);
impl std::fmt::Display for ObjectStorageError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "ObjectStorageError: {}", self.0)
}
}
impl std::error::Error for ObjectStorageError {}
pub struct ObjectStorage {
size: usize,
key: u64,
bucket: String,
}
impl ObjectStorage {
pub fn new(bucket: impl Into<String>, key: u64, size: usize) -> Result<Self> {
Ok(Self {
bucket: bucket.into(),
key,
size,
})
}
pub fn key(&self) -> u64 {
self.key
}
pub fn bucket(&self) -> &str {
&self.bucket
}
pub fn size(&self) -> usize {
self.size
}
}
impl nixl_sys::MemoryRegion for ObjectStorage {
unsafe fn as_ptr(&self) -> *const u8 {
std::ptr::null()
}
fn size(&self) -> usize {
self.size
}
}
impl nixl_sys::NixlDescriptor for ObjectStorage {
fn mem_type(&self) -> nixl_sys::MemType {
nixl_sys::MemType::Object
}
fn device_id(&self) -> u64 {
self.key
}
}
impl fmt::Debug for ObjectStorage {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("ObjectStorage")
.field("bucket", &self.bucket)
.field("key", &format!("{:#018x}", self.key))
.field("size", &self.size)
.finish()
}
}
impl super::Storage for ObjectStorage {
fn storage_type(&self) -> super::StorageType {
super::StorageType::Nixl
}
fn addr(&self) -> u64 {
0
}
fn size(&self) -> usize {
self.size
}
unsafe fn as_ptr(&self) -> *const u8 {
std::ptr::null()
}
unsafe fn as_mut_ptr(&mut self) -> *mut u8 {
std::ptr::null_mut()
}
}
impl super::Remote for ObjectStorage {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_object_storage_creation() {
let storage = ObjectStorage::new("test-bucket", 0x1234, 4096).unwrap();
assert_eq!(storage.bucket(), "test-bucket");
assert_eq!(storage.key(), 0x1234);
assert_eq!(storage.size(), 4096);
}
#[test]
fn test_nixl_descriptor() {
use nixl_sys::NixlDescriptor;
let storage = ObjectStorage::new("bucket", 0xABCD, 8192).unwrap();
assert_eq!(storage.mem_type(), nixl_sys::MemType::Object);
assert_eq!(storage.device_id(), 0xABCD);
}
}