Skip to content

plugin-addr

Placement compiled-in (in-process)
Source github.com/opencharly/charly/candy/plugin-addr
Version 2026.176.1800
Candy plugin-addr

This plugin is listed in charly/charly.yml’s compiled_plugins:, so its providers are compiled into the charly binary and register in-process.

The reserved words this plugin serves:

  • addr — verb class

The addr check verb relocated into a candy: an outside-in TCP reachability probe of a host:port (in-container nc under charly check box, host-side dial under charly check live). A HOST-COUPLED verb — its RunVerb runs against the live check engine (sdk/kit.CheckContext), so it is COMPILED-IN-ONLY. A pure check verb; a port/process-template relocation on the kit contract.

The CUE schema below is the authoritative grammar for this plugin’s input. It is the same single source that generates the plugin’s Go parameter types and answers the runtime Describe RPC, so this page cannot disagree with either.

// The BUILT-IN `addr` plugin's OWN CUE schema — the typed plugin_input for the `addr`
// verb (host-side `net.DialTimeout` under live mode, in-container `nc -z` under box
// mode). It is the SINGLE SOURCE for this plugin's params, used two ways (the same
// contract the reference examplerunverb and core `spec` use):
//
// 1. GENERATE the Go param struct — `cue exp gengotypes` (driven by task cue:gen,
// which wraps this with `package params` + `@go(params)`) emits
// ../params/cue_types_gen.go, so the provider decodes plugin_input into a TYPED
// struct, never a hand-parsed map.
// 2. VALIDATE authored input AT RUNTIME — the builtin serves this source over the
// Describe channel (InProcTransport) exactly like an external serves it over
// gRPC; the host splices it onto the base (base ++ plugin) and validates every
// authored `addr` step's plugin_input against #AddrInput.
//
// SELF-CONTAINED: it references NO base def, so it compiles standalone (gengotypes +
// the load-gate compile) AND splices onto the base — the base ++ plugin splice exists
// to detect a def-name collision with the base, not to resolve base refs.
//
// `reachable` was a SHARED base #Op field (the now-extracted `port` plugin also read
// it), but with both `port` and `addr` extracted it has NO remaining #Op consumer, so
// it is REMOVED from #Op and reproduced standalone here (a bare `bool`, NO def
// reference). The provider is a CheckVerbProvider — it dispatches IN-PROCESS via RunVerb
// and so keeps the live *Runner (r.Mode / r.Exec / r.DialTimeout) the probe + host dial
// need (mirrors examplerunverb).
#AddrInput: {
// addr — the host:port to probe for reachability (the verb discriminator).
addr: string @go(Addr)
// reachable — whether the address is expected to be reachable (default true). A
// tri-state pointer so an absent key means "expected reachable", matching the base
// #Op.reachable semantics the verb had before extraction.
reachable?: bool @go(Reachable,type=*bool)
}

See also the candy reference for this candy’s install surface.