///|
fn print_events(events : Array[@mpstream.MultipartEvent]) -> Unit {
  for event in events {
    match event {
      PartBegin(meta) => println("begin \{meta.name}")
      PartData(bytes) => println("data \{bytes.length()} bytes")
      PartEnd(index) => println("end #\{index}")
      MessageEnd => println("message complete")
    }
  }
}

///|
fn main raise {
  let boundary = "basic-demo"
  let writer = @mpstream.MultipartWriter::new(
    boundary,
    @mpstream.default_limits(),
  )
  let meta : @mpstream.PartMeta = {
    index: 0,
    name: "greeting",
    filename: None,
    content_type: Some("text/plain; charset=utf-8"),
    headers: [],
  }
  let wire = @buffer.Buffer()
  wire.write_bytes(writer.begin_part(meta))
  wire.write_bytes(writer.write(b"hello\x00moonbit"))
  wire.write_bytes(writer.end_part())
  wire.write_bytes(writer.finish())

  println("Content-Type: \{writer.content_type()}")
  let parser = @mpstream.MultipartParser::new(
    boundary,
    @mpstream.default_limits(),
  )
  let bytes = wire.to_bytes()
  for offset = 0; offset < bytes.length(); {
    let end = Int::min(offset + 3, bytes.length())
    print_events(parser.feed(bytes.view(start=offset, end~).to_owned()))
    continue end
  }
  print_events(parser.finish())
}