feat(server): add support for extra maps in adapter configuration

* Introduced ExtraMapConfig to allow multiple adapter configurations.
* Updated server and handler to utilize extra maps for routing.
* Added dashboard handler for metrics visualization.
This commit is contained in:
2026-04-11 21:43:14 +02:00
parent c12e16c9f7
commit c7a3fed6e1
10 changed files with 461 additions and 37 deletions

View File

@@ -10,6 +10,7 @@ import (
"github.com/Warky-Devs/vecna.git/pkg/adapter"
"github.com/Warky-Devs/vecna.git/pkg/config"
"github.com/Warky-Devs/vecna.git/pkg/server"
)
var (
@@ -94,7 +95,37 @@ func openWriter(path string) (io.Writer, error) {
// buildAdapter constructs the Adapter from the loaded config.
func buildAdapter(cfg *config.Config) (adapter.Adapter, error) {
ac := cfg.Adapter
return buildAdapterFromConfig(cfg.Adapter)
}
// buildExtraMapAdapters builds a server.ExtraMap for each entry in cfg.ExtraMaps.
// Unset adapter fields fall back to the global Adapter values.
func buildExtraMapAdapters(cfg *config.Config) (map[string]server.ExtraMap, error) {
result := make(map[string]server.ExtraMap, len(cfg.ExtraMaps))
for name, mc := range cfg.ExtraMaps {
ac := config.AdapterConfig{
Type: coalesce(mc.Type, cfg.Adapter.Type),
SourceDim: coalescei(mc.SourceDim, cfg.Adapter.SourceDim),
TargetDim: mc.TargetDim,
TruncateMode: coalesce(mc.TruncateMode, cfg.Adapter.TruncateMode),
PadMode: coalesce(mc.PadMode, cfg.Adapter.PadMode),
Seed: coalescei64(mc.Seed, cfg.Adapter.Seed),
MatrixFile: coalesce(mc.MatrixFile, cfg.Adapter.MatrixFile),
}
adp, err := buildAdapterFromConfig(ac)
if err != nil {
return nil, fmt.Errorf("extra_map %q: %w", name, err)
}
result[name] = server.ExtraMap{
Adapter: adp,
ForwardTarget: mc.ForwardTarget,
}
}
return result, nil
}
// buildAdapterFromConfig constructs an Adapter from an AdapterConfig.
func buildAdapterFromConfig(ac config.AdapterConfig) (adapter.Adapter, error) {
if ac.SourceDim == 0 && ac.TargetDim == 0 {
return adapter.NewPassthrough(), nil
}
@@ -124,6 +155,27 @@ func buildAdapter(cfg *config.Config) (adapter.Adapter, error) {
}
}
func coalesce(a, b string) string {
if a != "" {
return a
}
return b
}
func coalescei(a, b int) int {
if a != 0 {
return a
}
return b
}
func coalescei64(a, b int64) int64 {
if a != 0 {
return a
}
return b
}
func parseTruncateModes(truncMode, padMode string) (adapter.TruncateMode, adapter.PadMode, error) {
var tm adapter.TruncateMode
switch truncMode {

View File

@@ -48,6 +48,11 @@ func runServe(cmd *cobra.Command, _ []string) error {
return fmt.Errorf("build adapter: %w", err)
}
extraMaps, err := buildExtraMapAdapters(cfg)
if err != nil {
return fmt.Errorf("build extra_maps: %w", err)
}
clients, err := buildClients(cfg)
if err != nil {
return fmt.Errorf("build clients: %w", err)
@@ -58,7 +63,7 @@ func runServe(cmd *cobra.Command, _ []string) error {
reg = metrics.New()
}
router, err := server.New(cfg, clients, adp, reg, logger)
router, err := server.New(cfg, clients, adp, extraMaps, reg, logger)
if err != nil {
return fmt.Errorf("build router: %w", err)
}