///|
pub fn decode_datagram(
  datagram : Bytes,
  policy : DecodePolicy,
) -> Result[DecodedFrame, ProxyError] {
  let decoded = if datagram.length() >= 12 &&
    bytes_equal_constant_time(
      Bytes::from_array(datagram.to_array()[0:12]),
      v2_signature(),
    ) {
    decode_v2(datagram, policy)
  } else {
    decode_v1(datagram, policy)
  }
  match decoded {
    Err(err) =>
      if err.kind == NeedMoreData {
        Err(
          proxy_error(
            InvalidLength,
            err.offset,
            "a UDP datagram cannot be completed by a later datagram",
          ),
        )
      } else {
        Err(err)
      }
    Ok(frame) => Ok(frame)
  }
}