diff --git a/layout.go b/layout.go
index c3008e2..b761de8 100644
--- a/layout.go
+++ b/layout.go
@@ -249,3 +249,16 @@ func (e *layoutVariantError) InvalidSlots() []byte {
}
return append([]byte(nil), e.invalidSlots...)
}
+
+// InvalidPositions returns a copy of the 1-based positions of the invalid slot
+// characters in the original variant string.
+func (e *layoutVariantError) InvalidPositions() []int {
+ if e == nil || len(e.invalidPositions) == 0 {
+ return nil
+ }
+ positions := make([]int, len(e.invalidPositions))
+ for i, pos := range e.invalidPositions {
+ positions[i] = pos + 1
+ }
+ return positions
+}
diff --git a/layout_test.go b/layout_test.go
index 1db057a..7702686 100644
--- a/layout_test.go
+++ b/layout_test.go
@@ -183,6 +183,13 @@ func TestLayout_VariantError(t *testing.T) {
wantRender: `` +
`main`,
},
+ {
+ name: "multiple invalid slots",
+ variant: "H1X?",
+ wantErr: true,
+ wantErrString: "html: invalid layout variant H1X? (invalid slots: '1' at position 2, 'X' at position 3, '?' at position 4)",
+ wantRender: ``,
+ },
}
for _, tt := range tests {
@@ -201,8 +208,21 @@ func TestLayout_VariantError(t *testing.T) {
t.Fatalf("VariantError().Error() = %q, want %q", got, tt.wantErrString)
}
if err, ok := layout.VariantError().(*layoutVariantError); ok {
- if got := string(err.InvalidSlots()); got != "X" {
- t.Fatalf("InvalidSlots() = %q, want %q", got, "X")
+ switch tt.variant {
+ case "HXC":
+ if got := string(err.InvalidSlots()); got != "X" {
+ t.Fatalf("InvalidSlots() = %q, want %q", got, "X")
+ }
+ if got := err.InvalidPositions(); len(got) != 1 || got[0] != 2 {
+ t.Fatalf("InvalidPositions() = %v, want %v", got, []int{2})
+ }
+ case "H1X?":
+ if got := string(err.InvalidSlots()); got != "1X?" {
+ t.Fatalf("InvalidSlots() = %q, want %q", got, "1X?")
+ }
+ if got := err.InvalidPositions(); len(got) != 3 || got[0] != 2 || got[1] != 3 || got[2] != 4 {
+ t.Fatalf("InvalidPositions() = %v, want %v", got, []int{2, 3, 4})
+ }
}
} else {
t.Fatalf("VariantError() has unexpected concrete type %T", layout.VariantError())