///|
fn require_locale(tag : String) -> @moonlocale.Locale {
  match @moonlocale.Locale::parse(tag) {
    Ok(locale) => locale
    Err(error) => abort(error.message())
  }
}

///|
fn require_catalog(
  locale : @moonlocale.Locale,
  resources : Array[@moonlocale.MessageResource],
) -> @moonlocale.MessageCatalog {
  match @moonlocale.MessageCatalog::compile(locale, resources) {
    Ok(catalog) => catalog
    Err(error) => abort(error.message())
  }
}

///|
fn main {
  let en = require_locale("en")
  let zh = require_locale("zh-CN")
  let en_catalog = require_catalog(en, [
    @moonlocale.message_resource("welcome", "Welcome, {name}!"),
    @moonlocale.message_resource(
      "cart", "{count, plural, =0 {Your cart is empty} one {Your cart has one item} other {Your cart has # items}}",
    ),
  ])
  let zh_catalog = require_catalog(zh, [
    @moonlocale.message_resource("welcome", "欢迎,{name}!"),
    @moonlocale.message_resource("cart", "购物车中有 {count} 件商品"),
  ])
  let bundle = @moonlocale.MessageBundle::new(en, [en_catalog, zh_catalog]).unwrap()
  let request = require_locale("zh-Hans-CN")
  println(
    bundle
    .format(request, "welcome", [@moonlocale.string_argument("name", "Mina")])
    .unwrap(),
  )
  println(
    bundle
    .format(request, "cart", [@moonlocale.int_argument("count", 2500)])
    .unwrap(),
  )
  println(
    @moonlocale.format_currency(
      request,
      @moonlocale.Decimal::new(2599, 2),
      "CNY",
      @moonlocale.Symbol,
    ),
  )
  println(
    @moonlocale.format_byte_size(
      1572864,
      request,
      style=@moonlocale.BinaryBytes,
    ),
  )
  println(@moonlocale.format_duration(3723, request, max_parts=2))
}