Settle the main-relative context binding API
This commit is contained in:
@@ -1,7 +1,8 @@
|
|||||||
# Main-relative companion imports and overlays
|
# Main-relative companion imports and overlays
|
||||||
|
|
||||||
Status: accepted direction; public representation and remaining filesystem-policy
|
Status: accepted direction and public API structure; absent-main and remaining
|
||||||
choices are open. Not implemented. Implementation baseline: `191015e`.
|
filesystem-policy choices are open. Not implemented. Implementation baseline:
|
||||||
|
`191015e`.
|
||||||
|
|
||||||
## Purpose
|
## Purpose
|
||||||
|
|
||||||
@@ -90,8 +91,8 @@ outside this feature; it is not a second spelling for current overlay lookup.
|
|||||||
|
|
||||||
The application declares an underlay `Input` containing native imports and
|
The application declares an underlay `Input` containing native imports and
|
||||||
selects main-derived filesystem binding for that input. `Mapping` and `Bytes`
|
selects main-derived filesystem binding for that input. `Mapping` and `Bytes`
|
||||||
are first-class supported sources for this use. Exact Go declarations remain
|
are first-class supported sources for this use. OD-1 settles the public API
|
||||||
open in OD-1; no new operator-facing YAML syntax is needed.
|
structure below; no new operator-facing YAML syntax is needed.
|
||||||
|
|
||||||
Once the main is selected, ConfigKit supplies the underlay import base from
|
Once the main is selected, ConfigKit supplies the underlay import base from
|
||||||
that file's directory and binds the namespace and containment policy. Existing
|
that file's directory and binds the namespace and containment policy. Existing
|
||||||
@@ -106,9 +107,9 @@ context does not itself enable imports or change collection operations.
|
|||||||
|
|
||||||
The relationship is explicit on companion inputs. Independently located and
|
The relationship is explicit on companion inputs. Independently located and
|
||||||
embedded inputs keep their own contexts and can coexist in the same load.
|
embedded inputs keep their own contexts and can coexist in the same load.
|
||||||
Providing a concrete context should select that complete context over derived
|
Providing a concrete context selects that complete context over derived
|
||||||
binding, without field-by-field fallback or recovery from an invalid explicit
|
binding, without field-by-field fallback or recovery from an invalid explicit
|
||||||
context. OD-1 addresses how to represent those choices cleanly.
|
context. OD-1 records the representation and precedence rules.
|
||||||
|
|
||||||
There is no requirement to add a dedicated main-relative file constructor.
|
There is no requirement to add a dedicated main-relative file constructor.
|
||||||
Optional named-file acquisition is already expressible through the underlay's
|
Optional named-file acquisition is already expressible through the underlay's
|
||||||
@@ -242,30 +243,50 @@ application can discover its main, bind companion imports and the selected
|
|||||||
overlay, and receive normal resolved configuration and inspection in one load,
|
overlay, and receive normal resolved configuration and inspection in one load,
|
||||||
without an application directory walker, parser, or extra discovery pass.
|
without an application directory walker, parser, or extra discovery pass.
|
||||||
|
|
||||||
|
## Settled Decisions
|
||||||
|
|
||||||
|
### OD-1: Public representation of deferred context binding — settled
|
||||||
|
|
||||||
|
Add a small, optional main-relative binding description to `Input`, retaining
|
||||||
|
the concrete `Input.Filesystem` field. A helper supplies the common default
|
||||||
|
description; explicit settings group any absent-main controls decided in OD-2.
|
||||||
|
Companion `Mapping` and `Bytes` inputs use native imports for fragment selection.
|
||||||
|
Preserve the input's source, placement, import enablement, and tier.
|
||||||
|
|
||||||
|
The proposed shape is an `Input.MainRelative` field of type
|
||||||
|
`*MainRelativeContext`, with a `MainRelative()` convenience helper. These names
|
||||||
|
illustrate the settled structure; final spelling and OD-2's settings can be
|
||||||
|
finished during API design. For example, this unimplemented API sketch assumes
|
||||||
|
`companionDeclarations` contains ordinary native import declarations:
|
||||||
|
|
||||||
|
```go
|
||||||
|
configkit.Input{
|
||||||
|
Source: configkit.Mapping("companions", companionDeclarations),
|
||||||
|
Imports: true,
|
||||||
|
MainRelative: configkit.MainRelative(),
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
A nil binding preserves existing independent context behavior. A non-nil binding
|
||||||
|
requests context derivation during loading. If `Input.Filesystem` is also supplied,
|
||||||
|
that complete concrete context wins. Do not merge fields or fall back to derivation
|
||||||
|
when the explicit context is invalid. This permits overriding reusable companion
|
||||||
|
setup without clearing its binding declaration.
|
||||||
|
|
||||||
|
Layered overlays derive automatically when `OverlayFilesystem` is absent; no
|
||||||
|
additional opt-in flag is needed. An explicit overlay context wins as a whole.
|
||||||
|
If OD-2 calls for configurable overlay fallback behavior, reuse the small binding
|
||||||
|
settings where appropriate without requiring a general context-selection API.
|
||||||
|
|
||||||
|
Keep the binding on `Input`: `Source` still describes the supplied content and
|
||||||
|
`FilesystemContext` still describes a concrete location. This does not reinterpret
|
||||||
|
a file source's own path. Grouping related settings avoids scattering them across
|
||||||
|
a boolean and sibling fields, while keeping the addition smaller than a general
|
||||||
|
context selector. No source wrapper, deferred fields on `FilesystemContext`,
|
||||||
|
callback, or second file-selection API is needed for this design.
|
||||||
|
|
||||||
## Open Decisions
|
## Open Decisions
|
||||||
|
|
||||||
### OD-1: Public representation of deferred context binding
|
|
||||||
|
|
||||||
**Settled:** companion `Mapping` and `Bytes` inputs must work; native imports own
|
|
||||||
fragment selection. Layered overlays derive automatically when no explicit
|
|
||||||
context is supplied. Concrete contexts override derivation as a whole.
|
|
||||||
|
|
||||||
**Recommendation:** represent main-derived context as a small declarative choice
|
|
||||||
on an underlay `Input`, with a helper or constructor for the common case. Preserve
|
|
||||||
its existing source, placement, import enablement, and tier. If both binding intent
|
|
||||||
and `Input.Filesystem` are supplied, use the concrete context without merging
|
|
||||||
fields. This is appropriate for mapping/bytes inputs because their context owns
|
|
||||||
import resolution; it does not reinterpret a file source's own path. Include the
|
|
||||||
absent-main policy from OD-2 in the binding description. Exact names and shape
|
|
||||||
need an API sketch, but no callback or second file-selection API is necessary.
|
|
||||||
|
|
||||||
**Alternative:** introduce a shared context-selection descriptor for both inputs
|
|
||||||
and overlays, representing explicit, main-derived, and fallback contexts. This
|
|
||||||
could make the choices more uniform, particularly as fallback policy grows, but
|
|
||||||
adds a wider abstraction and must coexist with today's concrete context fields.
|
|
||||||
Rejecting simultaneous concrete and derived choices is viable but requires
|
|
||||||
callers to clear shared setup when providing an explicit override.
|
|
||||||
|
|
||||||
### OD-2: Scope and representation of absent-main handling
|
### OD-2: Scope and representation of absent-main handling
|
||||||
|
|
||||||
**Settled:** optional companions should support defaults-only startup; a declared
|
**Settled:** optional companions should support defaults-only startup; a declared
|
||||||
|
|||||||
Reference in New Issue
Block a user