///|
/// OCF block compression codecs supported by this release line.
pub(all) enum CompressionCodec {
  Null
  Deflate
} derive(Debug, Eq)

///|
pub fn CompressionCodec::name(self : CompressionCodec) -> String {
  match self {
    Null => "null"
    Deflate => "deflate"
  }
}

///|
pub fn CompressionCodec::parse(
  name : String,
) -> CompressionCodec raise OcfError {
  match name {
    "null" => Null
    "deflate" => Deflate
    unsupported => raise UnsupportedCodec(unsupported)
  }
}

///|
/// Parsed OCF header. The metadata map is kept intact so applications do not
/// lose vendor-specific fields.
pub struct OcfHeader {
  schema : @schema.Schema
  codec : CompressionCodec
  metadata : Map[String, Bytes]
  sync_marker : Bytes
} derive(Debug, Eq)

///|
pub fn OcfHeader::new(
  schema : @schema.Schema,
  codec? : CompressionCodec = Null,
  metadata? : Map[String, Bytes] = Map([]),
  sync_marker : Bytes,
) -> OcfHeader raise OcfError {
  if sync_marker.length() != 16 {
    raise InvalidSyncMarkerLength(actual=sync_marker.length())
  }
  { schema, codec, metadata, sync_marker }
}

///|
pub fn OcfHeader::schema(self : OcfHeader) -> @schema.Schema {
  self.schema
}

///|
pub fn OcfHeader::codec(self : OcfHeader) -> CompressionCodec {
  self.codec
}

///|
pub fn OcfHeader::metadata(self : OcfHeader) -> Map[String, Bytes] {
  self.metadata.copy()
}

///|
pub fn OcfHeader::sync_marker(self : OcfHeader) -> Bytes {
  self.sync_marker
}

///|
/// Apache Avro Object Container File magic bytes.
pub fn magic() -> Bytes {
  [b'O', b'b', b'j', 1]
}

///|
pub fn is_ocf(data : Bytes) -> Bool {
  data.has_prefix(magic())
}