The internal/cli package had grown to contain both CLI utilities (source/destination I/O) and registry-level abstractions (repr, conversion, engine, marshaler).
This PR separates concerns by moving registry types into internal/registry and keeping only CLI I/O types in internal/cli.
It also simplifies several core abstractions and aligns naming conventions.
Move Source, Destination from internal/config to internal/cli.
Move Repr, Conversion, Engine, Process, Codec from internal/cli to internal/registry.
Rename "marshalers" to "codecs" throughout the codebase.
Simplify codec.Codec[T, U] to codec.Codec[T] (string-based marshaling only).
Add codec.Conversion[T, U] as a function type alias.
Change engine.Engine[T] from an interface to a function type.
Merge Engine.Load() + Process.Set() into a single Engine.Load(Repr) call.
Convert Saccharine2Lambda from a struct to standalone conversion functions.
Add documentation comments and enable checkPublicInterface lint rule.
Rename reduce_one.go to reduce_once.go.
Decisions
Engine[T] is now a function type (func(T) (Process[T], error)) rather than an interface, since the only method was Load.
Codec[T, U] was split into Codec[T] (string marshaling) and Conversion[T, U] (type-to-type conversion function), which better reflects how they are actually used.
Registration uses free generic functions (RegisterCodec, RegisterEngine, RegisterConversion) instead of methods on Registry, enabling type inference at the call site.
Benefits
Clearer separation of concerns between CLI I/O and the registry's internal type system.
## Description
The `internal/cli` package had grown to contain both CLI utilities (source/destination I/O) and registry-level abstractions (repr, conversion, engine, marshaler).
This PR separates concerns by moving registry types into `internal/registry` and keeping only CLI I/O types in `internal/cli`.
It also simplifies several core abstractions and aligns naming conventions.
- Move `Source`, `Destination` from `internal/config` to `internal/cli`.
- Move `Repr`, `Conversion`, `Engine`, `Process`, `Codec` from `internal/cli` to `internal/registry`.
- Rename "marshalers" to "codecs" throughout the codebase.
- Simplify `codec.Codec[T, U]` to `codec.Codec[T]` (string-based marshaling only).
- Add `codec.Conversion[T, U]` as a function type alias.
- Change `engine.Engine[T]` from an interface to a function type.
- Merge `Engine.Load()` + `Process.Set()` into a single `Engine.Load(Repr)` call.
- Convert `Saccharine2Lambda` from a struct to standalone conversion functions.
- Replace registry methods (`MustAddMarshaler`, `MustAddEngine`, `MustAddConversions`) with generic free functions (`RegisterCodec`, `RegisterEngine`, `RegisterConversion`).
- Remove unused `internal/config` package (`Config`, `GetLogger`, `ParseFromArgs`).
- Remove unused `pkg/emitter` package.
- Rename `Id()` to `ID()` per Go conventions.
- Add documentation comments and enable `checkPublicInterface` lint rule.
- Rename `reduce_one.go` to `reduce_once.go`.
### Decisions
- `Engine[T]` is now a function type (`func(T) (Process[T], error)`) rather than an interface, since the only method was `Load`.
- `Codec[T, U]` was split into `Codec[T]` (string marshaling) and `Conversion[T, U]` (type-to-type conversion function), which better reflects how they are actually used.
- Registration uses free generic functions (`RegisterCodec`, `RegisterEngine`, `RegisterConversion`) instead of methods on `Registry`, enabling type inference at the call site.
## Benefits
- Clearer separation of concerns between CLI I/O and the registry's internal type system.
- Simpler abstractions: fewer interfaces, fewer wrapper types, fewer indirections.
- Removing unused packages (`config`, `emitter`) reduces maintenance burden.
- Naming conventions (`ID`, codecs, `reduce_once`) are more idiomatic.
## Checklist
- [x] Code follows conventional commit format.
- [x] Branch follows naming convention (`<type>/<description>`).
- [x] Tests pass (if applicable).
- [x] Documentation updated (if applicable).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Description
The
internal/clipackage had grown to contain both CLI utilities (source/destination I/O) and registry-level abstractions (repr, conversion, engine, marshaler).This PR separates concerns by moving registry types into
internal/registryand keeping only CLI I/O types ininternal/cli.It also simplifies several core abstractions and aligns naming conventions.
Source,Destinationfrominternal/configtointernal/cli.Repr,Conversion,Engine,Process,Codecfrominternal/clitointernal/registry.codec.Codec[T, U]tocodec.Codec[T](string-based marshaling only).codec.Conversion[T, U]as a function type alias.engine.Engine[T]from an interface to a function type.Engine.Load()+Process.Set()into a singleEngine.Load(Repr)call.Saccharine2Lambdafrom a struct to standalone conversion functions.MustAddMarshaler,MustAddEngine,MustAddConversions) with generic free functions (RegisterCodec,RegisterEngine,RegisterConversion).internal/configpackage (Config,GetLogger,ParseFromArgs).pkg/emitterpackage.Id()toID()per Go conventions.checkPublicInterfacelint rule.reduce_one.gotoreduce_once.go.Decisions
Engine[T]is now a function type (func(T) (Process[T], error)) rather than an interface, since the only method wasLoad.Codec[T, U]was split intoCodec[T](string marshaling) andConversion[T, U](type-to-type conversion function), which better reflects how they are actually used.RegisterCodec,RegisterEngine,RegisterConversion) instead of methods onRegistry, enabling type inference at the call site.Benefits
config,emitter) reduces maintenance burden.ID, codecs,reduce_once) are more idiomatic.Checklist
<type>/<description>).