diff --git a/python/python/async_tiff/enums.py b/python/python/async_tiff/enums.py index 724b77b..39b87d8 100644 --- a/python/python/async_tiff/enums.py +++ b/python/python/async_tiff/enums.py @@ -1,5 +1,22 @@ +import sys from enum import IntEnum +if sys.version_info >= (3, 11): + from enum import StrEnum +else: + from enum import Enum + class StrEnum(str, Enum): + def __str__(self): + return str(self.value) + +class Endianness(StrEnum): + """ + endianness of the underlying tiff file + """ + + LittleEndian = "LittleEndian" + BigEndian = "BigEndian" + class CompressionMethod(IntEnum): """ diff --git a/python/src/enums.rs b/python/src/enums.rs index 14656bd..2e3a659 100644 --- a/python/src/enums.rs +++ b/python/src/enums.rs @@ -1,11 +1,46 @@ -use async_tiff::tiff::tags::{ - CompressionMethod, PhotometricInterpretation, PlanarConfiguration, Predictor, ResolutionUnit, - SampleFormat, +use async_tiff::{ + reader::Endianness, + tiff::tags::{ + CompressionMethod, PhotometricInterpretation, PlanarConfiguration, Predictor, + ResolutionUnit, SampleFormat, + }, }; use pyo3::prelude::*; use pyo3::types::{PyString, PyTuple}; use pyo3::{intern, IntoPyObjectExt}; +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) struct PyEndianness(Endianness); + +impl From for PyEndianness { + fn from(value: Endianness) -> Self { + Self(value) + } +} + +impl From for Endianness { + fn from(value: PyEndianness) -> Self { + value.0 + } +} + +impl<'py> IntoPyObject<'py> for PyEndianness { + type Target = PyAny; + type Output = Bound<'py, PyAny>; + type Error = PyErr; + + fn into_pyobject(self, py: Python<'py>) -> Result { + // import the python module + let enums_mod = py.import(intern!(py, "async_tiff.enums"))?; + // get our python enum + let enum_cls = enums_mod.getattr(intern!(py, "Endianness"))?; + match self.0 { + Endianness::LittleEndian => enum_cls.getattr(intern!(py, "LittleEndian")), + Endianness::BigEndian => enum_cls.getattr(intern!(py, "BigEndian")), + } + } +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub(crate) struct PyCompressionMethod(CompressionMethod); diff --git a/python/src/ifd.rs b/python/src/ifd.rs index c8c59c6..dcbccde 100644 --- a/python/src/ifd.rs +++ b/python/src/ifd.rs @@ -4,8 +4,8 @@ use async_tiff::ImageFileDirectory; use pyo3::prelude::*; use crate::enums::{ - PyCompressionMethod, PyPhotometricInterpretation, PyPlanarConfiguration, PyPredictor, - PyResolutionUnit, PySampleFormat, + PyCompressionMethod, PyEndianness, PyPhotometricInterpretation, PyPlanarConfiguration, + PyPredictor, PyResolutionUnit, PySampleFormat, }; use crate::geo::PyGeoKeyDirectory; use crate::value::PyValue; @@ -15,6 +15,11 @@ pub(crate) struct PyImageFileDirectory(ImageFileDirectory); #[pymethods] impl PyImageFileDirectory { + #[getter] + pub fn endianness(&self) -> PyEndianness { + self.0.endianness().into() + } + #[getter] pub fn new_subfile_type(&self) -> Option { self.0.new_subfile_type() diff --git a/src/ifd.rs b/src/ifd.rs index f0da9c1..0dfc6e1 100644 --- a/src/ifd.rs +++ b/src/ifd.rs @@ -402,6 +402,11 @@ impl ImageFileDirectory { }) } + /// The Endianness of the file + pub fn endianness(&self) -> Endianness { + self.endianness + } + /// A general indication of the kind of data contained in this subfile. /// pub fn new_subfile_type(&self) -> Option { diff --git a/src/reader.rs b/src/reader.rs index 06520ec..94090e0 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -228,7 +228,7 @@ impl AsyncFileReader for ReqwestReader { } /// Endianness -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Endianness { /// Little Endian LittleEndian,