///|
pub fn decode(data : Bytes) -> ImageData raise DecodeError {
  match @decoder.decode_samples(data) {
    Ok(result) =>
      {
        width: result.width,
        height: result.height,
        num_components: result.num_components,
        bits_per_component: result.bits_per_component,
        is_signed: result.is_signed,
        data: result.samples,
      }
    Err(msg) => raise DecodeFailed(msg)
  }
}

///|
fn wrap_decode_samples_result(
  result : @orchestrate.DecodeSamplesResult,
) -> DecodeSamplesResult {
  {
    width: result.width,
    height: result.height,
    num_components: result.num_components,
    bits_per_component: result.bits_per_component,
    is_signed: result.is_signed,
    sample_layout: result.sample_layout,
    samples: result.samples,
  }
}

///|
fn decode_samples(data : Bytes) -> Result[DecodeSamplesResult, String] {
  match @decoder.decode_samples(data) {
    Ok(result) => Ok(wrap_decode_samples_result(result))
    Err(msg) => Err(msg)
  }
}

///|
fn decode_samples_audit(
  data : Bytes,
  packet_audit_limit? : Int = 300,
  force_relocated_ppt? : Bool = false,
) -> Result[DecodeSamplesResult, String] {
  match
    @decoder.decode_samples_audit(
      data,
      packet_audit_limit~,
      force_relocated_ppt~,
    ) {
    Ok(result) => Ok(wrap_decode_samples_result(result))
    Err(msg) => Err(msg)
  }
}