///|
/// Worker Loader binding used to run isolated, dynamically supplied code.
#external
pub type WorkerLoader

///|
pub fn WorkerLoader::as_any(self : WorkerLoader) -> @core.Any = "%identity"

///|
pub fn CloudflareEnv::get_worker_loader(
  self : CloudflareEnv,
  key : String,
) -> WorkerLoader? {
  match self.get(key) {
    Some(value) => Some(value.cast())
    None => None
  }
}

///|
#external
pub type DynamicWorkerStub

///|
pub fn DynamicWorkerStub::as_any(self : DynamicWorkerStub) -> @core.Any = "%identity"

///|
/// The callback supplies WorkerCode on a cache miss. Use a versioned ID.
pub fn WorkerLoader::get(
  self : WorkerLoader,
  id : String,
  code : () -> @core.Any,
) -> DynamicWorkerStub {
  self.as_any()._call("get", [@core.any(id), @core.any(code)]).cast()
}

///|
pub fn DynamicWorkerStub::get_durable_object_class(
  self : DynamicWorkerStub,
  name : String,
) -> @core.Any {
  self.as_any()._call("getDurableObjectClass", [@core.any(name)])
}

///|
#external
pub type DurableObjectFacets

///|
pub fn DurableObjectFacets::as_any(self : DurableObjectFacets) -> @core.Any = "%identity"

///|
pub fn DurableObjectState::facets(
  self : DurableObjectState,
) -> DurableObjectFacets {
  self.as_any()["facets"].cast()
}

///|
#external
pub type FacetStub

///|
pub fn FacetStub::as_any(self : FacetStub) -> @core.Any = "%identity"

///|
/// The callback returns FacetStartupOptions with a `class` field.
pub fn DurableObjectFacets::get(
  self : DurableObjectFacets,
  name : String,
  startup : () -> @core.Any,
) -> FacetStub {
  self.as_any()._call("get", [@core.any(name), @core.any(startup)]).cast()
}

///|
pub fn DurableObjectFacets::abort(
  self : DurableObjectFacets,
  name : String,
  reason : @core.Any,
) -> Unit {
  self.as_any()._call("abort", [@core.any(name), reason]) |> ignore
}

///|
pub fn DurableObjectFacets::delete(
  self : DurableObjectFacets,
  name : String,
) -> Unit {
  self.as_any()._call("delete", [@core.any(name)]) |> ignore
}

///|
pub async fn FacetStub::fetch(
  self : FacetStub,
  request : @core.Any,
) -> @core.Any {
  let promise : @core.Promise[@core.Any] = self
    .as_any()
    ._call("fetch", [request])
    .cast()
  promise.wait()
}