use crate::error::Result;
use crate::transfer_syntax::explicit_le::ExplicitVRLittleEndianDecoder;
use crate::transfer_syntax::implicit_le::{
ImplicitVRLittleEndianDecoder, StandardImplicitVRLittleEndianDecoder,
};
use byteordered::Endianness;
use dicom_core::header::{DataElementHeader, SequenceItemHeader};
use dicom_core::Tag;
use std::io::Read;
pub mod basic;
pub mod erased;
pub fn get_default_reader<S>() -> StandardImplicitVRLittleEndianDecoder<S>
where
S: Read,
{
ImplicitVRLittleEndianDecoder::default()
}
pub fn get_file_header_decoder<S>() -> ExplicitVRLittleEndianDecoder<S>
where
S: Read,
{
ExplicitVRLittleEndianDecoder::default()
}
pub trait BasicDecode {
fn endianness(&self) -> Endianness;
fn decode_us<S>(&self, source: S) -> Result<u16>
where
S: Read;
fn decode_ul<S>(&self, source: S) -> Result<u32>
where
S: Read;
fn decode_uv<S>(&self, source: S) -> Result<u64>
where
S: Read;
fn decode_ss<S>(&self, source: S) -> Result<i16>
where
S: Read;
fn decode_sl<S>(&self, source: S) -> Result<i32>
where
S: Read;
fn decode_sv<S>(&self, source: S) -> Result<i64>
where
S: Read;
fn decode_fl<S>(&self, source: S) -> Result<f32>
where
S: Read;
fn decode_fd<S>(&self, source: S) -> Result<f64>
where
S: Read;
fn decode_tag<S>(&self, mut source: S) -> Result<Tag>
where
S: Read,
{
let g = self.decode_us(&mut source)?;
let e = self.decode_us(source)?;
Ok(Tag(g, e))
}
}
impl<T: ?Sized> BasicDecode for Box<T>
where
T: BasicDecode,
{
fn endianness(&self) -> Endianness {
self.as_ref().endianness()
}
fn decode_us<S>(&self, source: S) -> Result<u16>
where
S: Read,
{
(**self).decode_us(source)
}
fn decode_ul<S>(&self, source: S) -> Result<u32>
where
S: Read,
{
(**self).decode_ul(source)
}
fn decode_uv<S>(&self, source: S) -> Result<u64>
where
S: Read,
{
(**self).decode_uv(source)
}
fn decode_ss<S>(&self, source: S) -> Result<i16>
where
S: Read,
{
(**self).decode_ss(source)
}
fn decode_sl<S>(&self, source: S) -> Result<i32>
where
S: Read,
{
(**self).decode_sl(source)
}
fn decode_sv<S>(&self, source: S) -> Result<i64>
where
S: Read,
{
(**self).decode_sv(source)
}
fn decode_fl<S>(&self, source: S) -> Result<f32>
where
S: Read,
{
(**self).decode_fl(source)
}
fn decode_fd<S>(&self, source: S) -> Result<f64>
where
S: Read,
{
(**self).decode_fd(source)
}
fn decode_tag<S>(&self, source: S) -> Result<Tag>
where
S: Read,
{
(**self).decode_tag(source)
}
}
impl<'a, T: ?Sized> BasicDecode for &'a T
where
T: BasicDecode,
{
fn endianness(&self) -> Endianness {
(*self).endianness()
}
fn decode_us<S>(&self, source: S) -> Result<u16>
where
S: Read,
{
(**self).decode_us(source)
}
fn decode_ul<S>(&self, source: S) -> Result<u32>
where
S: Read,
{
(**self).decode_ul(source)
}
fn decode_uv<S>(&self, source: S) -> Result<u64>
where
S: Read,
{
(**self).decode_uv(source)
}
fn decode_ss<S>(&self, source: S) -> Result<i16>
where
S: Read,
{
(**self).decode_ss(source)
}
fn decode_sl<S>(&self, source: S) -> Result<i32>
where
S: Read,
{
(**self).decode_sl(source)
}
fn decode_sv<S>(&self, source: S) -> Result<i64>
where
S: Read,
{
(**self).decode_sv(source)
}
fn decode_fl<S>(&self, source: S) -> Result<f32>
where
S: Read,
{
(**self).decode_fl(source)
}
fn decode_fd<S>(&self, source: S) -> Result<f64>
where
S: Read,
{
(**self).decode_fd(source)
}
fn decode_tag<S>(&self, source: S) -> Result<Tag>
where
S: Read,
{
(**self).decode_tag(source)
}
}
pub trait Decode {
type Source: ?Sized + Read;
fn decode_header(&self, source: &mut Self::Source) -> Result<DataElementHeader>;
fn decode_item_header(&self, source: &mut Self::Source) -> Result<SequenceItemHeader>;
fn decode_tag(&self, source: &mut Self::Source) -> Result<Tag>;
}
impl<T: ?Sized> Decode for Box<T>
where
T: Decode,
{
type Source = <T as Decode>::Source;
fn decode_header(&self, source: &mut Self::Source) -> Result<DataElementHeader> {
(**self).decode_header(source)
}
fn decode_item_header(&self, source: &mut Self::Source) -> Result<SequenceItemHeader> {
(**self).decode_item_header(source)
}
fn decode_tag(&self, source: &mut Self::Source) -> Result<Tag> {
(**self).decode_tag(source)
}
}
impl<'a, T: ?Sized> Decode for &'a T
where
T: Decode,
{
type Source = <T as Decode>::Source;
fn decode_header(&self, source: &mut Self::Source) -> Result<DataElementHeader> {
(**self).decode_header(source)
}
fn decode_item_header(&self, source: &mut Self::Source) -> Result<SequenceItemHeader> {
(**self).decode_item_header(source)
}
fn decode_tag(&self, source: &mut Self::Source) -> Result<Tag> {
(**self).decode_tag(source)
}
}