use byteorder::{BigEndian, LittleEndian};
use crate::{common::WkbGeometryCode, error::WkbError, Endianness};
use std::io::{Cursor, Error};
pub(crate) trait ReadBytesExt: byteorder::ReadBytesExt {
fn read_u32(&mut self, byte_order: Endianness) -> Result<u32, Error> {
match byte_order {
Endianness::BigEndian => byteorder::ReadBytesExt::read_u32::<BigEndian>(self),
Endianness::LittleEndian => byteorder::ReadBytesExt::read_u32::<LittleEndian>(self),
}
}
fn read_f64(&mut self, byte_order: Endianness) -> Result<f64, Error> {
match byte_order {
Endianness::BigEndian => byteorder::ReadBytesExt::read_f64::<BigEndian>(self),
Endianness::LittleEndian => byteorder::ReadBytesExt::read_f64::<LittleEndian>(self),
}
}
}
impl<R: std::io::Read + ?Sized> ReadBytesExt for R {}
pub(crate) fn has_srid(buf: &[u8], byte_order: Endianness) -> Result<bool, WkbError> {
let mut reader = Cursor::new(buf);
reader.set_position(1);
let geometry_code = WkbGeometryCode::new(reader.read_u32(byte_order)?);
Ok(geometry_code.has_srid())
}