///|
/// The standard eight-byte SBE message header, without transport framing.
pub(all) struct MessageHeader {
  block_length : Int32
  template_id : Int32
  schema_id : Int32
  version : Int32
} derive(Eq, Debug)

///|
pub fn MessageHeader::write(
  self : MessageHeader,
  writer : Writer,
) -> Unit raise SbeError {
  for
    value in [self.block_length, self.template_id, self.schema_id, self.version] {
    if value < 0 || value > 65535 {
      raise InvalidValue("header", "header values must fit uint16")
    }
    writer.write_uint(value.to_uint64(), 2)
  }
}

///|
pub fn MessageHeader::read(reader : Reader) -> MessageHeader raise SbeError {
  {
    block_length: reader.read_uint(2).to_int(),
    template_id: reader.read_uint(2).to_int(),
    schema_id: reader.read_uint(2).to_int(),
    version: reader.read_uint(2).to_int(),
  }
}