refactor(engine): map config to settings payload
- commit
- 4ed4d971c265a8511e83cee18786f57e00bc046e
- author
- brice · · 2026-06-23 13:25 UTC
- committer
- brice · · 2026-06-23 20:01 UTC
- parent
- 15efbc7
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
2 files · +131 -0
A internal/bootstrap/runtime_config.go +36 -0
| @@ -0,0 +1,36 @@ | |||
| 1 | + | package bootstrap | |
| 2 | + | ||
| 3 | + | import ( | |
| 4 | + | "github.com/bnema/dumber/internal/application/port" | |
| 5 | + | "github.com/bnema/dumber/internal/infrastructure/config" | |
| 6 | + | ) | |
| 7 | + | ||
| 8 | + | func EngineSettingsPayloadFromConfig(cfg *config.Config) port.EngineSettingsPayload { | |
| 9 | + | if cfg == nil { | |
| 10 | + | return port.EngineSettingsPayload{} | |
| 11 | + | } | |
| 12 | + | return port.EngineSettingsPayload{ | |
| 13 | + | DefaultUIScale: cfg.DefaultUIScale, | |
| 14 | + | WebContent: port.EngineWebContentSettingsPayload{ | |
| 15 | + | SansFont: cfg.Appearance.SansFont, | |
| 16 | + | SerifFont: cfg.Appearance.SerifFont, | |
| 17 | + | MonospaceFont: cfg.Appearance.MonospaceFont, | |
| 18 | + | DefaultFontSize: cfg.Appearance.DefaultFontSize, | |
| 19 | + | EnableDevTools: cfg.Debug.EnableDevTools, | |
| 20 | + | CaptureConsole: cfg.Logging.CaptureConsole, | |
| 21 | + | DrawCompositingIndicators: cfg.Engine.WebKit.DrawCompositingIndicators, | |
| 22 | + | HardwareDecoding: engineHardwareDecodingModeFromConfig(cfg.Media.HardwareDecodingMode), | |
| 23 | + | }, | |
| 24 | + | } | |
| 25 | + | } | |
| 26 | + | ||
| 27 | + | func engineHardwareDecodingModeFromConfig(mode config.HardwareDecodingMode) port.EngineHardwareDecodingMode { | |
| 28 | + | switch mode { | |
| 29 | + | case config.HardwareDecodingForce: | |
| 30 | + | return port.EngineHardwareDecodingForce | |
| 31 | + | case config.HardwareDecodingDisable: | |
| 32 | + | return port.EngineHardwareDecodingDisable | |
| 33 | + | default: | |
| 34 | + | return port.EngineHardwareDecodingAuto | |
| 35 | + | } | |
| 36 | + | } | |
| @@ -0,0 +1,36 @@ | |||||
| 1 | + | package bootstrap | |||
| 2 | + | ||||
| 3 | + | import ( | |||
| 4 | + | "github.com/bnema/dumber/internal/application/port" | |||
| 5 | + | "github.com/bnema/dumber/internal/infrastructure/config" | |||
| 6 | + | ) | |||
| 7 | + | ||||
| 8 | + | func EngineSettingsPayloadFromConfig(cfg *config.Config) port.EngineSettingsPayload { | |||
| 9 | + | if cfg == nil { | |||
| 10 | + | return port.EngineSettingsPayload{} | |||
| 11 | + | } | |||
| 12 | + | return port.EngineSettingsPayload{ | |||
| 13 | + | DefaultUIScale: cfg.DefaultUIScale, | |||
| 14 | + | WebContent: port.EngineWebContentSettingsPayload{ | |||
| 15 | + | SansFont: cfg.Appearance.SansFont, | |||
| 16 | + | SerifFont: cfg.Appearance.SerifFont, | |||
| 17 | + | MonospaceFont: cfg.Appearance.MonospaceFont, | |||
| 18 | + | DefaultFontSize: cfg.Appearance.DefaultFontSize, | |||
| 19 | + | EnableDevTools: cfg.Debug.EnableDevTools, | |||
| 20 | + | CaptureConsole: cfg.Logging.CaptureConsole, | |||
| 21 | + | DrawCompositingIndicators: cfg.Engine.WebKit.DrawCompositingIndicators, | |||
| 22 | + | HardwareDecoding: engineHardwareDecodingModeFromConfig(cfg.Media.HardwareDecodingMode), | |||
| 23 | + | }, | |||
| 24 | + | } | |||
| 25 | + | } | |||
| 26 | + | ||||
| 27 | + | func engineHardwareDecodingModeFromConfig(mode config.HardwareDecodingMode) port.EngineHardwareDecodingMode { | |||
| 28 | + | switch mode { | |||
| 29 | + | case config.HardwareDecodingForce: | |||
| 30 | + | return port.EngineHardwareDecodingForce | |||
| 31 | + | case config.HardwareDecodingDisable: | |||
| 32 | + | return port.EngineHardwareDecodingDisable | |||
| 33 | + | default: | |||
| 34 | + | return port.EngineHardwareDecodingAuto | |||
| 35 | + | } | |||
| 36 | + | } | |||
A internal/bootstrap/runtime_config_test.go +95 -0
| @@ -0,0 +1,95 @@ | |||
| 1 | + | package bootstrap | |
| 2 | + | ||
| 3 | + | import ( | |
| 4 | + | "testing" | |
| 5 | + | ||
| 6 | + | "github.com/bnema/dumber/internal/application/port" | |
| 7 | + | "github.com/bnema/dumber/internal/infrastructure/config" | |
| 8 | + | ) | |
| 9 | + | ||
| 10 | + | func TestEngineSettingsPayloadFromConfigMapsRuntimeFields(t *testing.T) { | |
| 11 | + | cfg := config.DefaultConfig() | |
| 12 | + | cfg.DefaultUIScale = 1.25 | |
| 13 | + | cfg.Appearance.SansFont = "Inter" | |
| 14 | + | cfg.Appearance.SerifFont = "Literata" | |
| 15 | + | cfg.Appearance.MonospaceFont = "Fira Code" | |
| 16 | + | cfg.Appearance.DefaultFontSize = 17 | |
| 17 | + | cfg.Debug.EnableDevTools = true | |
| 18 | + | cfg.Logging.CaptureConsole = true | |
| 19 | + | cfg.Engine.WebKit.DrawCompositingIndicators = true | |
| 20 | + | cfg.Media.HardwareDecodingMode = config.HardwareDecodingForce | |
| 21 | + | ||
| 22 | + | got := EngineSettingsPayloadFromConfig(cfg) | |
| 23 | + | ||
| 24 | + | if got.DefaultUIScale != 1.25 { | |
| 25 | + | t.Fatalf("DefaultUIScale=%v, want 1.25", got.DefaultUIScale) | |
| 26 | + | } | |
| 27 | + | if got.WebContent.SansFont != "Inter" || | |
| 28 | + | got.WebContent.SerifFont != "Literata" || | |
| 29 | + | got.WebContent.MonospaceFont != "Fira Code" || | |
| 30 | + | got.WebContent.DefaultFontSize != 17 { | |
| 31 | + | t.Fatalf("font settings not mapped: %#v", got.WebContent) | |
| 32 | + | } | |
| 33 | + | if !got.WebContent.EnableDevTools || | |
| 34 | + | !got.WebContent.CaptureConsole || | |
| 35 | + | !got.WebContent.DrawCompositingIndicators { | |
| 36 | + | t.Fatalf("debug settings not mapped: %#v", got.WebContent) | |
| 37 | + | } | |
| 38 | + | if got.WebContent.HardwareDecoding != port.EngineHardwareDecodingForce { | |
| 39 | + | t.Fatalf("HardwareDecoding=%q, want %q", got.WebContent.HardwareDecoding, port.EngineHardwareDecodingForce) | |
| 40 | + | } | |
| 41 | + | } | |
| 42 | + | ||
| 43 | + | func TestEngineSettingsPayloadFromNilConfigReturnsZeroPayload(t *testing.T) { | |
| 44 | + | got := EngineSettingsPayloadFromConfig(nil) | |
| 45 | + | if got != (port.EngineSettingsPayload{}) { | |
| 46 | + | t.Fatalf("payload=%#v, want zero value", got) | |
| 47 | + | } | |
| 48 | + | } | |
| 49 | + | ||
| 50 | + | func TestEngineSettingsPayloadFromConfigMapsHardwareDecodingModes(t *testing.T) { | |
| 51 | + | tests := []struct { | |
| 52 | + | name string | |
| 53 | + | mode config.HardwareDecodingMode | |
| 54 | + | want port.EngineHardwareDecodingMode | |
| 55 | + | }{ | |
| 56 | + | { | |
| 57 | + | name: "auto", | |
| 58 | + | mode: config.HardwareDecodingAuto, | |
| 59 | + | want: port.EngineHardwareDecodingAuto, | |
| 60 | + | }, | |
| 61 | + | { | |
| 62 | + | name: "force", | |
| 63 | + | mode: config.HardwareDecodingForce, | |
| 64 | + | want: port.EngineHardwareDecodingForce, | |
| 65 | + | }, | |
| 66 | + | { | |
| 67 | + | name: "disable", | |
| 68 | + | mode: config.HardwareDecodingDisable, | |
| 69 | + | want: port.EngineHardwareDecodingDisable, | |
| 70 | + | }, | |
| 71 | + | { | |
| 72 | + | name: "unknown", | |
| 73 | + | mode: config.HardwareDecodingMode("surprise"), | |
| 74 | + | want: port.EngineHardwareDecodingAuto, | |
| 75 | + | }, | |
| 76 | + | { | |
| 77 | + | name: "zero value", | |
| 78 | + | mode: "", | |
| 79 | + | want: port.EngineHardwareDecodingAuto, | |
| 80 | + | }, | |
| 81 | + | } | |
| 82 | + | ||
| 83 | + | for _, tt := range tests { | |
| 84 | + | t.Run(tt.name, func(t *testing.T) { | |
| 85 | + | cfg := config.DefaultConfig() | |
| 86 | + | cfg.Media.HardwareDecodingMode = tt.mode | |
| 87 | + | ||
| 88 | + | got := EngineSettingsPayloadFromConfig(cfg) | |
| 89 | + | ||
| 90 | + | if got.WebContent.HardwareDecoding != tt.want { | |
| 91 | + | t.Fatalf("HardwareDecoding=%q, want %q", got.WebContent.HardwareDecoding, tt.want) | |
| 92 | + | } | |
| 93 | + | }) | |
| 94 | + | } | |
| 95 | + | } | |
| @@ -0,0 +1,95 @@ | |||||
| 1 | + | package bootstrap | |||
| 2 | + | ||||
| 3 | + | import ( | |||
| 4 | + | "testing" | |||
| 5 | + | ||||
| 6 | + | "github.com/bnema/dumber/internal/application/port" | |||
| 7 | + | "github.com/bnema/dumber/internal/infrastructure/config" | |||
| 8 | + | ) | |||
| 9 | + | ||||
| 10 | + | func TestEngineSettingsPayloadFromConfigMapsRuntimeFields(t *testing.T) { | |||
| 11 | + | cfg := config.DefaultConfig() | |||
| 12 | + | cfg.DefaultUIScale = 1.25 | |||
| 13 | + | cfg.Appearance.SansFont = "Inter" | |||
| 14 | + | cfg.Appearance.SerifFont = "Literata" | |||
| 15 | + | cfg.Appearance.MonospaceFont = "Fira Code" | |||
| 16 | + | cfg.Appearance.DefaultFontSize = 17 | |||
| 17 | + | cfg.Debug.EnableDevTools = true | |||
| 18 | + | cfg.Logging.CaptureConsole = true | |||
| 19 | + | cfg.Engine.WebKit.DrawCompositingIndicators = true | |||
| 20 | + | cfg.Media.HardwareDecodingMode = config.HardwareDecodingForce | |||
| 21 | + | ||||
| 22 | + | got := EngineSettingsPayloadFromConfig(cfg) | |||
| 23 | + | ||||
| 24 | + | if got.DefaultUIScale != 1.25 { | |||
| 25 | + | t.Fatalf("DefaultUIScale=%v, want 1.25", got.DefaultUIScale) | |||
| 26 | + | } | |||
| 27 | + | if got.WebContent.SansFont != "Inter" || | |||
| 28 | + | got.WebContent.SerifFont != "Literata" || | |||
| 29 | + | got.WebContent.MonospaceFont != "Fira Code" || | |||
| 30 | + | got.WebContent.DefaultFontSize != 17 { | |||
| 31 | + | t.Fatalf("font settings not mapped: %#v", got.WebContent) | |||
| 32 | + | } | |||
| 33 | + | if !got.WebContent.EnableDevTools || | |||
| 34 | + | !got.WebContent.CaptureConsole || | |||
| 35 | + | !got.WebContent.DrawCompositingIndicators { | |||
| 36 | + | t.Fatalf("debug settings not mapped: %#v", got.WebContent) | |||
| 37 | + | } | |||
| 38 | + | if got.WebContent.HardwareDecoding != port.EngineHardwareDecodingForce { | |||
| 39 | + | t.Fatalf("HardwareDecoding=%q, want %q", got.WebContent.HardwareDecoding, port.EngineHardwareDecodingForce) | |||
| 40 | + | } | |||
| 41 | + | } | |||
| 42 | + | ||||
| 43 | + | func TestEngineSettingsPayloadFromNilConfigReturnsZeroPayload(t *testing.T) { | |||
| 44 | + | got := EngineSettingsPayloadFromConfig(nil) | |||
| 45 | + | if got != (port.EngineSettingsPayload{}) { | |||
| 46 | + | t.Fatalf("payload=%#v, want zero value", got) | |||
| 47 | + | } | |||
| 48 | + | } | |||
| 49 | + | ||||
| 50 | + | func TestEngineSettingsPayloadFromConfigMapsHardwareDecodingModes(t *testing.T) { | |||
| 51 | + | tests := []struct { | |||
| 52 | + | name string | |||
| 53 | + | mode config.HardwareDecodingMode | |||
| 54 | + | want port.EngineHardwareDecodingMode | |||
| 55 | + | }{ | |||
| 56 | + | { | |||
| 57 | + | name: "auto", | |||
| 58 | + | mode: config.HardwareDecodingAuto, | |||
| 59 | + | want: port.EngineHardwareDecodingAuto, | |||
| 60 | + | }, | |||
| 61 | + | { | |||
| 62 | + | name: "force", | |||
| 63 | + | mode: config.HardwareDecodingForce, | |||
| 64 | + | want: port.EngineHardwareDecodingForce, | |||
| 65 | + | }, | |||
| 66 | + | { | |||
| 67 | + | name: "disable", | |||
| 68 | + | mode: config.HardwareDecodingDisable, | |||
| 69 | + | want: port.EngineHardwareDecodingDisable, | |||
| 70 | + | }, | |||
| 71 | + | { | |||
| 72 | + | name: "unknown", | |||
| 73 | + | mode: config.HardwareDecodingMode("surprise"), | |||
| 74 | + | want: port.EngineHardwareDecodingAuto, | |||
| 75 | + | }, | |||
| 76 | + | { | |||
| 77 | + | name: "zero value", | |||
| 78 | + | mode: "", | |||
| 79 | + | want: port.EngineHardwareDecodingAuto, | |||
| 80 | + | }, | |||
| 81 | + | } | |||
| 82 | + | ||||
| 83 | + | for _, tt := range tests { | |||
| 84 | + | t.Run(tt.name, func(t *testing.T) { | |||
| 85 | + | cfg := config.DefaultConfig() | |||
| 86 | + | cfg.Media.HardwareDecodingMode = tt.mode | |||
| 87 | + | ||||
| 88 | + | got := EngineSettingsPayloadFromConfig(cfg) | |||
| 89 | + | ||||
| 90 | + | if got.WebContent.HardwareDecoding != tt.want { | |||
| 91 | + | t.Fatalf("HardwareDecoding=%q, want %q", got.WebContent.HardwareDecoding, tt.want) | |||
| 92 | + | } | |||
| 93 | + | }) | |||
| 94 | + | } | |||
| 95 | + | } | |||