///|
/// Public facade for schema APIs.
pub using @schema {
  parse,
  type Primitive,
  type Field,
  type NamedDefinition,
  type Schema,
  type SchemaError,
  type SchemaKind,
}

///|
/// Public facade for datum codec APIs.
pub using @codec {
  decode,
  decode_from,
  encode,
  encode_into,
  type CodecError,
  type CodecLimits,
  type Datum,
  type Decoder,
  type Encoder,
}

///|
/// Public facade for Object Container File APIs.
pub using @ocf {
  decode_container,
  decode_header,
  encode_container,
  encode_container_blocks,
  encode_header,
  is_ocf,
  magic,
  type CompressionCodec,
  type OcfBlockConfig,
  type OcfError,
  type OcfHeader,
  type OcfLimits,
  type OcfReader,
  type OcfWriter,
  default_block_config,
  default_limits,
}

///|
/// Public facade for schema-driven Avro JSON datum conversion.
pub using @json {from_json, stringify, to_json, type JsonError, type JsonLimits}

///|
/// Public error type for Avro Single-Object Encoding operations.
pub using @single_object {type SingleObjectError}

///|
/// Encode one datum using the Avro Single-Object Encoding envelope.
pub fn encode_single_object(
  schema : Schema,
  datum : Datum,
) -> Bytes raise SingleObjectError {
  @single_object.encode(schema, datum)
}

///|
/// Decode one Single-Object Encoding value using an expected schema.
pub fn decode_single_object(
  schema : Schema,
  input : Bytes,
  limits? : CodecLimits = CodecLimits::new(),
) -> Datum raise SingleObjectError {
  @single_object.decode(schema, input, limits~)
}

///|
/// Resolve a Single-Object Encoding writer schema by fingerprint and decode
/// the enclosed datum.
pub fn decode_single_object_resolved(
  input : Bytes,
  resolve : (UInt64) -> Schema?,
  limits? : CodecLimits = CodecLimits::new(),
) -> (Schema, Datum) raise SingleObjectError {
  @single_object.decode_resolved(input, resolve, limits~)
}

///|
/// Extract the CRC-64-AVRO schema fingerprint from a single-object envelope.
pub fn single_object_fingerprint(
  input : Bytes,
) -> UInt64 raise SingleObjectError {
  @single_object.fingerprint(input)
}

///|
/// Parse JSON text into a datum without colliding with the schema `parse` API.
pub fn parse_json(
  schema : Schema,
  input : String,
  limits? : JsonLimits = JsonLimits::new(),
) -> Datum raise JsonError {
  @json.parse(schema, input, limits~)
}