Skip to content

Commit 5501c8a

Browse files
committed
Handle String only and value only scenarios correctly
1 parent 21b55c1 commit 5501c8a

File tree

6 files changed

+86
-35
lines changed

6 files changed

+86
-35
lines changed

goenums.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import (
3434
"github.com/zarldev/goenums/pkg/generator"
3535
)
3636

37-
const VERSION = "v0.3.0"
37+
const VERSION = "v0.3.2"
3838

3939
func main() {
4040
var (

pkg/generator/generator.go

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"io"
2222
"log"
2323
"os"
24+
"path"
2425
"strconv"
2526
"strings"
2627
)
@@ -126,15 +127,22 @@ func ParseAndGenerate(filename string, failfast bool) error {
126127
Enums: enums,
127128
}
128129
// create new file
129-
f, err := os.Create(typeLower + "_enums.go")
130+
// get the p from the filename
131+
132+
p := path.Dir(filename)
133+
// path separator
134+
linuxPathSeparator := "/"
135+
fullPath := p + linuxPathSeparator + typeLower + "_enums.go"
136+
fmt.Println("Creating file: ", fullPath)
137+
f, err := os.Create(fullPath)
130138
if err != nil {
131139
log.Fatalf("Error creating file: %v", err)
132140
}
133141
w := io.StringWriter(f)
134142
defer f.Close()
135143
writeAll(w, enumRep)
136144
// format the file
137-
err = formatFile(typeLower + "_enums.go")
145+
err = formatFile(fullPath)
138146
if err != nil {
139147
return fmt.Errorf("failed to format file: %w", err)
140148
}
@@ -197,7 +205,7 @@ func parseEnums(node *ast.File, typeComments map[string]string) ([]Enum, string,
197205
iotaTypeComment = getTypeComment(valueSpec, typeComments)
198206
comment := getComment(valueSpec)
199207
valid := !strings.Contains(comment, "invalid")
200-
comment, alternate := getAlternateName(comment, name)
208+
comment, alternate := getAlternateName(comment, name, nameTPairs)
201209
nameTPairsCopy := copyNameTPairs(nameTPairs, getValues(comment))
202210
enums = append(enums, Enum{
203211
Info: info{
@@ -294,29 +302,34 @@ func copyNameTPairs(nameTPairs []nameTypePair, values []string) []nameTypePair {
294302
return nameTPairsCopy
295303
}
296304

297-
func getAlternateName(comment string, name *ast.Ident) (string, string) {
305+
func getAlternateName(comment string, name *ast.Ident, nameTPairs []nameTypePair) (string, string) {
306+
// get value between the first space and the first comma
307+
comment = strings.TrimLeft(comment, " ")
298308
count := strings.Count(comment, " ")
299-
alternate := name.Name
300-
if count > 0 {
301-
nameComm := strings.Split(comment, " ")
302-
alternate = nameComm[0]
303-
comment = nameComm[1]
304-
}
305-
if comment != "" {
306-
alternate = comment
309+
switch count {
310+
case 0:
311+
if comment == "" {
312+
return "", name.Name
313+
}
314+
if strings.Contains(comment, ",") {
315+
return comment, name.Name
316+
}
317+
if len(nameTPairs) == 1 {
318+
return comment, name.Name
319+
}
320+
return comment, comment
321+
case 1:
322+
split := strings.Split(comment, " ")
323+
return split[1], split[0]
307324
}
308-
comment = strings.TrimSpace(comment)
309-
return comment, alternate
325+
return comment, name.Name
310326
}
311327

312328
func getComment(valueSpec *ast.ValueSpec) string {
313329
var comment string
314330
if valueSpec.Comment != nil && len(valueSpec.Comment.List) > 0 {
315-
comment = strings.TrimSpace(valueSpec.Comment.List[0].Text)
316-
331+
comment = valueSpec.Comment.List[0].Text
317332
comment = comment[2:]
318-
319-
comment = strings.TrimSpace(comment)
320333
}
321334
return comment
322335
}
@@ -484,12 +497,12 @@ func generateIndexAndNameRun(rep EnumRepresentation) (string, string) {
484497
nameConst := fmt.Sprintf("_%s_name = %q\n", rep.TypeInfo.Lower, b.String())
485498
b.Reset()
486499
fmt.Fprintf(b, " _%s_index = [...]uint16{0", rep.TypeInfo.Lower)
487-
idx := rep.TypeInfo.Index
500+
// idx := rep.TypeInfo.Index
488501
for _, i := range indexes {
489502
if i > 0 {
490503
fmt.Fprintf(b, ", ")
491504
}
492-
fmt.Fprintf(b, "%d", idx)
505+
fmt.Fprintf(b, "%d", i)
493506
}
494507
fmt.Fprintf(b, "}\n")
495508
return b.String(), nameConst
@@ -554,7 +567,6 @@ func writePackage(w io.StringWriter, rep EnumRepresentation) {
554567
func writeImports(w io.StringWriter, rep EnumRepresentation) {
555568
w.WriteString("import (\n")
556569
w.WriteString("\t\"fmt\"\n")
557-
w.WriteString("\t\"strings\"\n")
558570
w.WriteString("\t\"strconv\"\n")
559571
w.WriteString("\t\"bytes\"\n")
560572
w.WriteString("\t\"database/sql/driver\"\n")
@@ -649,10 +661,10 @@ func setupIntToTypeMethod(w io.StringWriter, rep EnumRepresentation) {
649661

650662
func setupStringToTypeMethod(w io.StringWriter, rep EnumRepresentation) {
651663
w.WriteString("func stringTo" + rep.TypeInfo.Camel + "(s string) " + rep.TypeInfo.Camel + " {\n")
652-
w.WriteString("\tlwr := strings.ToLower(s)\n")
653-
w.WriteString("\tswitch lwr {\n")
664+
// w.WriteString("\tlwr := strings.ToLower(s)\n")
665+
w.WriteString("\tswitch s {\n")
654666
for _, info := range rep.Enums {
655-
w.WriteString("\tcase \"" + info.Info.Lower + "\":\n")
667+
w.WriteString("\tcase \"" + info.Info.AlternateName + "\":\n")
656668
w.WriteString("\t\treturn " + rep.TypeInfo.PluralCamel + "." + info.Info.Upper + "\n")
657669
}
658670
w.WriteString("\t}\n")

pkg/generator/generator_test.go

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import (
99

1010
func TestParseAndGenerateSimple(t *testing.T) {
1111
t.Log("TestParseAndGenerate")
12-
filename := "testdata/validation/status.go"
12+
path := "testdata/validation/"
13+
filename := path + "status.go"
1314
err := generator.ParseAndGenerate(filename, true)
1415
if err != nil {
1516
t.Errorf("Expected nil, got %v", err)
1617
}
1718
// check if the generated file exists
18-
filename = "statuses_enums.go"
19+
filename = path + "statuses_enums.go"
1920
if _, err := os.Stat(filename); os.IsNotExist(err) {
2021
t.Errorf("Expected file to exist, got %v", err)
2122
}
@@ -28,13 +29,14 @@ func TestParseAndGenerateSimple(t *testing.T) {
2829

2930
func TestParseAndGenerateComplex(t *testing.T) {
3031
t.Log("TestParseAndGenerate")
31-
filename := "testdata/solarsystem/planets.go"
32+
path := "testdata/solarsystem/"
33+
filename := path + "planets.go"
3234
err := generator.ParseAndGenerate(filename, false)
3335
if err != nil {
3436
t.Errorf("Expected nil, got %v", err)
3537
}
3638
// check if the generated file exists
37-
filename = "planets_enums.go"
39+
filename = path + "planets_enums.go"
3840
if _, err := os.Stat(filename); os.IsNotExist(err) {
3941
t.Errorf("Expected file to exist, got %v", err)
4042
}
@@ -47,13 +49,14 @@ func TestParseAndGenerateComplex(t *testing.T) {
4749

4850
func TestParseAndGenerateCamelCase(t *testing.T) {
4951
t.Log("TestParseAndGenerate")
50-
filename := "testdata/sale/discount.go"
52+
path := "testdata/sale/"
53+
filename := path + "discount.go"
5154
err := generator.ParseAndGenerate(filename, false)
5255
if err != nil {
5356
t.Errorf("Expected nil, got %v", err)
5457
}
5558
// check if the generated file exists
56-
filename = "discounttypes_enums.go"
59+
filename = path + "discounttypes_enums.go"
5760
if _, err := os.Stat(filename); os.IsNotExist(err) {
5861
t.Errorf("Expected file to exist, got %v", err)
5962
}
@@ -66,13 +69,34 @@ func TestParseAndGenerateCamelCase(t *testing.T) {
6669

6770
func TestParseAndGenerateOnlyStrings(t *testing.T) {
6871
t.Log("TestParseAndGenerate")
69-
filename := "testdata/planets/planets.go"
72+
path := "testdata/planets/"
73+
filename := path + "planets.go"
7074
err := generator.ParseAndGenerate(filename, false)
7175
if err != nil {
7276
t.Errorf("Expected nil, got %v", err)
7377
}
7478
// check if the generated file exists
75-
filename = "planets_enums.go"
79+
filename = path + "planets_enums.go"
80+
if _, err := os.Stat(filename); os.IsNotExist(err) {
81+
t.Errorf("Expected file to exist, got %v", err)
82+
}
83+
// cleanup
84+
err = os.Remove(filename)
85+
if err != nil {
86+
t.Errorf("Expected nil, got %v", err)
87+
}
88+
}
89+
90+
func TestParseAndGenerateOnlyExtensions(t *testing.T) {
91+
t.Log("TestParseAndGenerate")
92+
path := "testdata/planets-extended/"
93+
filename := path + "planets.go"
94+
err := generator.ParseAndGenerate(filename, false)
95+
if err != nil {
96+
t.Errorf("Expected nil, got %v", err)
97+
}
98+
// check if the generated file exists
99+
filename = path + "planets_enums.go"
76100
if _, err := os.Stat(filename); os.IsNotExist(err) {
77101
t.Errorf("Expected file to exist, got %v", err)
78102
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package planetsc
2+
3+
type planet int // Gravity[float64]
4+
5+
//go:generate goenums -f planets.go
6+
const (
7+
mercury planet = iota // 2
8+
venus // 2
9+
earth // 1
10+
mars // 3
11+
jupiter // 69
12+
saturn // 58
13+
uranus // 25
14+
neptune // 24
15+
)

pkg/generator/testdata/planets/planets.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package enums
1+
package planets
22

33
type planet int
44

pkg/generator/testdata/solarsystem/planets.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package milkyway
1+
package solarsystem
22

33
type planet int // Gravity[float64],RadiusKm[float64],MassKg[float64],OrbitKm[float64],OrbitDays[float64],SurfacePressureBars[float64],Moons[int],Rings[bool]
44

0 commit comments

Comments
 (0)