Skip to content

Commit 1313733

Browse files
committed
refactor: enforce hexagonal architecture naming and layer boundaries
Move pure domain logic out of infrastructure into their correct layers: - VariableResolver → resolver/domain/ (no external deps) - FlexboxEngine → layout/domain/ (no external deps) - ParseHexColor/RGBA → shared/domain/ (cross-cutting domain utility) Rename files to follow naming conventions: - Domain ports: port.go → entity name (parser.go, renderer.go, etc.) - Application: service.go → use case name (parse.go, render.go, etc.) - Infrastructure: named by technology (gopdf_renderer.go, fs_font_loader.go, etc.) - Split asset/domain/port.go → font_loader.go + image_loader.go Remove obsolete .gitkeep placeholder directories.
1 parent b6eb8af commit 1313733

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+98
-92
lines changed

cmd/render.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ import (
1111
assetApp "github.com/vpedrosa/pen2pdf/internal/asset/application"
1212
assetInfra "github.com/vpedrosa/pen2pdf/internal/asset/infrastructure"
1313
layoutApp "github.com/vpedrosa/pen2pdf/internal/layout/application"
14+
layoutDomain "github.com/vpedrosa/pen2pdf/internal/layout/domain"
1415
layoutInfra "github.com/vpedrosa/pen2pdf/internal/layout/infrastructure"
1516
parserApp "github.com/vpedrosa/pen2pdf/internal/parser/application"
1617
parserInfra "github.com/vpedrosa/pen2pdf/internal/parser/infrastructure"
1718
rendererApp "github.com/vpedrosa/pen2pdf/internal/renderer/application"
1819
rendererInfra "github.com/vpedrosa/pen2pdf/internal/renderer/infrastructure"
1920
resolverApp "github.com/vpedrosa/pen2pdf/internal/resolver/application"
20-
resolverInfra "github.com/vpedrosa/pen2pdf/internal/resolver/infrastructure"
21+
resolverDomain "github.com/vpedrosa/pen2pdf/internal/resolver/domain"
2122
shared "github.com/vpedrosa/pen2pdf/internal/shared/domain"
2223
)
2324

@@ -68,9 +69,9 @@ func runRender(cmd *cobra.Command, args []string) error {
6869

6970
// Build application services (inject ports via DI)
7071
parseSvc := parserApp.NewParseService(parserInfra.NewJSONParser())
71-
resolveSvc := resolverApp.NewResolveService(resolverInfra.NewVariableResolver())
72+
resolveSvc := resolverApp.NewResolveService(resolverDomain.NewVariableResolver())
7273
fontSvc := assetApp.NewFontService(fontLoader)
73-
layoutSvc := layoutApp.NewLayoutService(layoutInfra.NewFlexboxEngine(), measurer)
74+
layoutSvc := layoutApp.NewLayoutService(layoutDomain.NewFlexboxEngine(), measurer)
7475
renderSvc := rendererApp.NewRenderService(pdfRenderer)
7576

7677
// 1. Parse

cmd/validate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
parserApp "github.com/vpedrosa/pen2pdf/internal/parser/application"
99
parserInfra "github.com/vpedrosa/pen2pdf/internal/parser/infrastructure"
1010
resolverApp "github.com/vpedrosa/pen2pdf/internal/resolver/application"
11-
resolverInfra "github.com/vpedrosa/pen2pdf/internal/resolver/infrastructure"
11+
resolverDomain "github.com/vpedrosa/pen2pdf/internal/resolver/domain"
1212
)
1313

1414
var validateCmd = &cobra.Command{
@@ -33,7 +33,7 @@ func runValidate(cmd *cobra.Command, args []string) error {
3333
defer inputFile.Close() //nolint:errcheck
3434

3535
parseSvc := parserApp.NewParseService(parserInfra.NewJSONParser())
36-
resolveSvc := resolverApp.NewResolveService(resolverInfra.NewVariableResolver())
36+
resolveSvc := resolverApp.NewResolveService(resolverDomain.NewVariableResolver())
3737

3838
doc, err := parseSvc.Parse(inputFile)
3939
if err != nil {
File renamed without changes.
File renamed without changes.
Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
11
package domain
22

3-
// ImageData holds a loaded image ready for use by the renderer.
4-
type ImageData struct {
5-
Path string
6-
Width int
7-
Height int
8-
Data []byte
9-
}
10-
113
// FontData holds a loaded font ready for use by the layout engine and renderer.
124
type FontData struct {
135
Family string
@@ -17,11 +9,6 @@ type FontData struct {
179
Data []byte
1810
}
1911

20-
// ImageLoader abstracts image loading from the filesystem.
21-
type ImageLoader interface {
22-
LoadImage(path string) (*ImageData, error)
23-
}
24-
2512
// FontLoader abstracts font loading and resolution.
2613
type FontLoader interface {
2714
LoadFont(family, weight, style string) (*FontData, error)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package domain_test
2+
3+
import (
4+
"testing"
5+
6+
asset "github.com/vpedrosa/pen2pdf/internal/asset/domain"
7+
)
8+
9+
type stubFontLoader struct {
10+
font *asset.FontData
11+
err error
12+
}
13+
14+
func (s *stubFontLoader) LoadFont(_, _, _ string) (*asset.FontData, error) {
15+
return s.font, s.err
16+
}
17+
18+
func TestFontLoaderInterfaceCompliance(t *testing.T) {
19+
var _ asset.FontLoader = &stubFontLoader{}
20+
}
21+
22+
func TestStubFontLoaderReturnsData(t *testing.T) {
23+
expected := &asset.FontData{Family: "Inter", Weight: "700", Style: "normal", Path: "Inter-Bold.ttf"}
24+
loader := &stubFontLoader{font: expected}
25+
26+
got, err := loader.LoadFont("Inter", "700", "normal")
27+
if err != nil {
28+
t.Fatalf("unexpected error: %v", err)
29+
}
30+
if got.Family != "Inter" {
31+
t.Errorf("expected family 'Inter', got '%s'", got.Family)
32+
}
33+
if got.Weight != "700" {
34+
t.Errorf("expected weight '700', got '%s'", got.Weight)
35+
}
36+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package domain
2+
3+
// ImageData holds a loaded image ready for use by the renderer.
4+
type ImageData struct {
5+
Path string
6+
Width int
7+
Height int
8+
Data []byte
9+
}
10+
11+
// ImageLoader abstracts image loading from the filesystem.
12+
type ImageLoader interface {
13+
LoadImage(path string) (*ImageData, error)
14+
}

internal/asset/domain/port_test.go renamed to internal/asset/domain/image_loader_test.go

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,10 @@ func (s *stubImageLoader) LoadImage(_ string) (*asset.ImageData, error) {
1616
return s.img, s.err
1717
}
1818

19-
type stubFontLoader struct {
20-
font *asset.FontData
21-
err error
22-
}
23-
24-
func (s *stubFontLoader) LoadFont(_, _, _ string) (*asset.FontData, error) {
25-
return s.font, s.err
26-
}
27-
2819
func TestImageLoaderInterfaceCompliance(t *testing.T) {
2920
var _ asset.ImageLoader = &stubImageLoader{}
3021
}
3122

32-
func TestFontLoaderInterfaceCompliance(t *testing.T) {
33-
var _ asset.FontLoader = &stubFontLoader{}
34-
}
35-
3623
func TestStubImageLoaderReturnsData(t *testing.T) {
3724
expected := &asset.ImageData{Path: "bg.jpg", Width: 800, Height: 600, Data: []byte{0xFF}}
3825
loader := &stubImageLoader{img: expected}
@@ -57,19 +44,3 @@ func TestStubImageLoaderReturnsError(t *testing.T) {
5744
t.Errorf("expected ErrUnexpectedEOF, got %v", err)
5845
}
5946
}
60-
61-
func TestStubFontLoaderReturnsData(t *testing.T) {
62-
expected := &asset.FontData{Family: "Inter", Weight: "700", Style: "normal", Path: "Inter-Bold.ttf"}
63-
loader := &stubFontLoader{font: expected}
64-
65-
got, err := loader.LoadFont("Inter", "700", "normal")
66-
if err != nil {
67-
t.Fatalf("unexpected error: %v", err)
68-
}
69-
if got.Family != "Inter" {
70-
t.Errorf("expected family 'Inter', got '%s'", got.Family)
71-
}
72-
if got.Weight != "700" {
73-
t.Errorf("expected weight '700', got '%s'", got.Weight)
74-
}
75-
}

internal/asset/infrastructure/fs/.gitkeep

Whitespace-only changes.
File renamed without changes.

0 commit comments

Comments
 (0)