///|
/// The smallest useful moonsver example; the README quotes this file.
///
/// Run it with `moon run examples`.

///|
fn show_version() -> Unit raise {
  let v = @moonsver.Version::parse("1.2.3-alpha.1+build.5")
  println(v.to_string()) // 1.2.3-alpha.1+build.5
  println(v.core_string()) // 1.2.3
  println(v.is_prerelease()) // true
}

///|
fn show_precedence() -> Unit raise {
  let a = @moonsver.Version::parse("1.0.0-alpha")
  let b = @moonsver.Version::parse("1.0.0")
  println(a.precedence_cmp(b)) // -1
  println(b.precedence_cmp(a)) // 1
  println(a.precedence_cmp(a)) // 0
}

///|
fn show_range() -> Unit raise {
  let r = @moonsver.Range::parse("^1.2.3")
  println(r.to_string()) // >=1.2.3, <2.0.0
  for s in ["1.2.2", "1.2.3", "1.9.0", "2.0.0", "2.0.0-rc.1"] {
    let v = @moonsver.Version::parse(s)
    println("\{s} → \{r.satisfies(v)}")
  }
}

///|
fn show_bump() -> Unit raise {
  let v = @moonsver.Version::parse("1.2.3")
  println(v.inc(@moonsver.Major).to_string()) // 2.0.0
  println(v.inc(@moonsver.Minor).to_string()) // 1.3.0
  println(v.inc(@moonsver.Patch).to_string()) // 1.2.4
  println(v.inc(@moonsver.Prerelease).to_string()) // 1.2.4-0
}

///|
/// Pick the newest version that fits a constraint: moonctl's bread and butter.
fn pick_latest() -> Unit raise {
  let versions : Array[@moonsver.Version] = []
  for s in ["1.0.0", "1.2.0", "1.2.3", "1.2.4", "1.3.0-rc.1", "2.0.0"] {
    versions.push(@moonsver.Version::parse(s))
  }
  let constraint = @moonsver.Range::parse("~1.2.0")
  match constraint.max_satisfying(versions) {
    Some(v) => println("newest 1.2.x available: \{v}")
    None => println("no version fits that constraint")
  }
}

///|
fn main {
  try {
    show_version()
    show_precedence()
    show_range()
    show_bump()
    pick_latest()
  } catch {
    e => println("refused: \{e}")
  }
}