Skip to content

ADR-002: Struct-as-set: {key: true} over arrays for types and dependencies

Field Value
Status accepted
Date 2025-01-01

Context

Resources need type membership and dependency declarations. Arrays require list.Contains (O(n)) and produce duplicates on unification.

Decision

Use struct-as-set pattern: {@type: {DNSServer: true, LXCContainer: true}} and {depends_on: {dns: true}}. O(1) membership, clean CUE unification, no duplicates.

Rationale

CUE unifies structs by merging keys. {A: true} & {B: true} = {A: true, B: true}. Arrays would need explicit dedup. Struct keys are unique by construction.

Consequences

  • All @type fields use {[string]: true} not [...string]
  • JSON-LD export converts to arrays: [for t, _ in @type {t}]
  • Provider matching uses resource[@type][providerType] != | (O(1))