detached 4ed4d97

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 VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · 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+}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close