// Copyright 2026 Leo Cheng
// SPDX-License-Identifier: Apache-2.0

///|
/// The whole surface in one run: a service holding its registration while a caller follows it.
///
///     moon run src/examples/tour --target native
#coverage.skip
async fn main {
  let registry = @memory.Registry::new()
  let endpoint = @moonsd.Endpoint::new(
    "10.0.0.1",
    12000,
    metadata=Map([("zone", "a")]),
  )
  let view = @moonsd.View::new()
  @async.with_task_group(group => {
    let following = group.spawn(
      () => view.follow(registry, "greeter"),
      allow_failure=true,
    )
    let holding = group.spawn(
      () => @moonsd.hold(registry, "greeter", endpoint),
      allow_failure=true,
    )
    @async.sleep(50)
    let held = view.endpoints().map(e => e.address())
    println("while held: " + held.join(", "))
    println("in the registry: \{registry.resolve("greeter").length()}")
    holding.cancel()
    @async.sleep(50)
    println("after it leaves: \{view.endpoints().length()} endpoints")
    following.cancel()
  })
  println("revision \{registry.revision()}")
}