use pyo3::prelude::*;
use pyo3::types::PyBytes;
use crate::shm::SharedMemory as RustSharedMemory;
#[pyclass(name = "SharedMemory")]
pub struct PySharedMemory {
inner: RustSharedMemory,
}
#[pymethods]
impl PySharedMemory {
#[staticmethod]
fn create(name: &str, size: usize) -> PyResult<Self> {
let inner = RustSharedMemory::create(name, size)?;
Ok(Self { inner })
}
#[staticmethod]
fn open(name: &str) -> PyResult<Self> {
let inner = RustSharedMemory::open(name)?;
Ok(Self { inner })
}
#[getter]
fn name(&self) -> &str {
self.inner.name()
}
#[getter]
fn size(&self) -> usize {
self.inner.size()
}
#[getter]
fn is_owner(&self) -> bool {
self.inner.is_owner()
}
fn write(&mut self, offset: usize, data: &[u8]) -> PyResult<()> {
self.inner.write(offset, data)?;
Ok(())
}
fn read(&self, py: Python<'_>, offset: usize, size: usize) -> PyResult<Py<PyBytes>> {
let data = self.inner.read(offset, size)?;
Ok(PyBytes::new(py, &data).into())
}
fn read_all(&self, py: Python<'_>) -> PyResult<Py<PyBytes>> {
let data = self.inner.read(0, self.inner.size())?;
Ok(PyBytes::new(py, &data).into())
}
}