use crate::error::Result;
use byteordered::Endianness;
use dicom_core::{DataElementHeader, Tag};
use std::io::Write;
pub mod basic;
pub trait BasicEncode {
fn endianness(&self) -> Endianness;
fn encode_us<S>(&self, to: S, value: u16) -> Result<()>
where
S: Write;
fn encode_ul<S>(&self, to: S, value: u32) -> Result<()>
where
S: Write;
fn encode_ss<S>(&self, to: S, value: i16) -> Result<()>
where
S: Write;
fn encode_sl<S>(&self, to: S, value: i32) -> Result<()>
where
S: Write;
fn encode_fl<S>(&self, to: S, value: f32) -> Result<()>
where
S: Write;
fn encode_fd<S>(&self, to: S, value: f64) -> Result<()>
where
S: Write;
#[inline]
fn with_encoder<T, F1, F2>(&self, f_le: F1, f_be: F2) -> T
where
F1: FnOnce(self::basic::LittleEndianBasicEncoder) -> T,
F2: FnOnce(self::basic::BigEndianBasicEncoder) -> T,
{
match self.endianness() {
Endianness::Little => f_le(self::basic::LittleEndianBasicEncoder),
Endianness::Big => f_be(self::basic::BigEndianBasicEncoder),
}
}
}
pub trait Encode {
type Writer: ?Sized + Write;
fn encode_tag(&self, to: &mut Self::Writer, tag: Tag) -> Result<()>;
fn encode_element_header(&self, to: &mut Self::Writer, de: DataElementHeader) -> Result<usize>;
fn encode_item_header(&self, to: &mut Self::Writer, len: u32) -> Result<()>;
fn encode_item_delimiter(&self, to: &mut Self::Writer) -> Result<()> {
self.encode_tag(to, Tag(0xFFFE, 0xE00D))?;
to.write_all(&[0u8; 4])?;
Ok(())
}
fn encode_sequence_delimiter(&self, to: &mut Self::Writer) -> Result<()> {
self.encode_tag(to, Tag(0xFFFE, 0xE0DD))?;
to.write_all(&[0u8; 4])?;
Ok(())
}
}