Skip to content

Commit be7ca89

Browse files
authored
refactoring (#2)
1 parent cb3ff42 commit be7ca89

25 files changed

+860
-485
lines changed

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
BSD 3-Clause License
22

3-
Copyright (c) 2025, Mikhail Knyazhev <markus621@yandex.com>
3+
Copyright (c) 2025-2026, Mikhail Knyazhev <markus621@yandex.com>
44

55
Redistribution and use in source and binary forms, with or without
66
modification, are permitted provided that the following conditions are met:

golang/common_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Copyright (c) 2025-2026 Mikhail Knyazhev <markus621@yandex.com>. All rights reserved.
3+
* Use of this source code is governed by a BSD 3-Clause license that can be found in the LICENSE file.
4+
*/
5+
6+
package golang_test
7+
8+
import (
9+
"bytes"
10+
"fmt"
11+
"testing"
12+
13+
. "go.osspkg.com/gogen/golang"
14+
)
15+
16+
func Test_newStmt(t *testing.T) {
17+
//SetRawMode()
18+
19+
buf := bytes.NewBuffer(nil)
20+
21+
stmt := Comment("Autogenerate code").
22+
Package("main").
23+
Import("fmt", "fmt").
24+
Import("fmt2", "fmt").
25+
Join(
26+
Func().ID("main").Bracket().Block(
27+
Comment("d").
28+
Var().ID("a").Op("=").
29+
Map(Interface().Block(), Interface().Block(ID("Do").Bracket().Error())).
30+
Block(
31+
Text("a").Op(":").Text("").Op(","),
32+
Array(2).Int8().Op(":").Raw("1").Op(","),
33+
).
34+
Comment("d"),
35+
Var().ID("b").Op("=").New(Int8()),
36+
Var().ID("b").Op("=").Make(Slice().Int8(), 0, 10),
37+
Op("*").ID("aaa").Op("=").Append(Op("*").ID("aaa"), Slice().Byte().Op("...")),
38+
For().List(ID("a"), ID("b")).Op(":=").Range().Pkg("fmt").ID("aa").Block(),
39+
For().Block(
40+
Select().Block(),
41+
),
42+
Switch().ID("aa").Op(".").Bracket(ID("type")).Block(
43+
Case().Slice().Byte().Op(":").Block(
44+
Pkg("fmt").ID("Println").Call(ID("aa")),
45+
),
46+
Default().Op(":"),
47+
),
48+
),
49+
)
50+
51+
if err := Render(buf, stmt); err != nil {
52+
t.Fatal(err)
53+
}
54+
55+
fmt.Println("______________________________")
56+
fmt.Print(buf.String())
57+
fmt.Println("______________________________")
58+
}

golang/config.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
/*
2-
* Copyright (c) 2025 Mikhail Knyazhev <markus621@yandex.com>. All rights reserved.
2+
* Copyright (c) 2025-2026 Mikhail Knyazhev <markus621@yandex.com>. All rights reserved.
33
* Use of this source code is governed by a BSD 3-Clause license that can be found in the LICENSE file.
44
*/
55

66
package golang
77

88
import (
9-
config2 "go.osspkg.com/gogen/internal/config"
9+
cfg "go.osspkg.com/gogen/internal/config"
1010
)
1111

12-
var _ config2.Config = (*config)(nil)
12+
var _ cfg.Config = (*config)(nil)
1313

1414
type config struct{}
1515

@@ -24,15 +24,15 @@ func (c config) OperationAvailable(op string) bool {
2424
}
2525
}
2626

27-
func (config) CommentSingle() config2.OpenClose {
28-
return config2.OpenClose{
27+
func (config) CommentSingle() cfg.OpenClose {
28+
return cfg.OpenClose{
2929
Open: "//",
3030
Close: "\n",
3131
}
3232
}
3333

34-
func (config) CommentMulti() config2.OpenClose {
35-
return config2.OpenClose{
34+
func (config) CommentMulti() cfg.OpenClose {
35+
return cfg.OpenClose{
3636
Open: "/*\n",
3737
Close: "\n*/\n",
3838
}

golang/render.go

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,93 @@
11
/*
2-
* Copyright (c) 2025 Mikhail Knyazhev <markus621@yandex.com>. All rights reserved.
2+
* Copyright (c) 2025-2026 Mikhail Knyazhev <markus621@yandex.com>. All rights reserved.
33
* Use of this source code is governed by a BSD 3-Clause license that can be found in the LICENSE file.
44
*/
55

66
package golang
77

88
import (
9+
"bufio"
910
"bytes"
11+
"fmt"
1012
"go/format"
1113
"io"
14+
"regexp"
15+
"strconv"
16+
"sync/atomic"
1217

1318
"go.osspkg.com/gogen/types"
1419
)
1520

21+
var rawMode = atomic.Bool{}
22+
23+
func SetRawMode() {
24+
rawMode.Store(true)
25+
}
26+
27+
func SetDefaultMode() {
28+
rawMode.Store(false)
29+
}
30+
1631
func Render(w io.Writer, arg types.Token) error {
1732
buf := bytes.NewBuffer(nil)
33+
1834
if err := arg.Render(buf); err != nil {
1935
return err
2036
}
21-
b, err := format.Source(buf.Bytes())
22-
if err != nil {
23-
return err
37+
38+
var (
39+
b []byte
40+
err error
41+
)
42+
43+
if rawMode.Load() {
44+
b = buf.Bytes()
45+
} else {
46+
if b, err = format.Source(buf.Bytes()); err != nil {
47+
return fmt.Errorf(
48+
"gofmt error: %w%s",
49+
err, getBadCode(buf.Bytes(), err),
50+
)
51+
}
2452
}
53+
2554
if _, err = w.Write(b); err != nil {
2655
return err
2756
}
57+
2858
return nil
2959
}
60+
61+
var rex = regexp.MustCompile(`(?iU)^(\d+)\:(\d+)\:`)
62+
63+
func getBadCode(b []byte, err error) string {
64+
if err == nil {
65+
return ""
66+
}
67+
68+
found := rex.FindStringSubmatch(err.Error())
69+
if len(found) != 3 {
70+
return ""
71+
}
72+
73+
line, err := strconv.ParseInt(found[1], 10, 64)
74+
if err != nil {
75+
return ""
76+
}
77+
78+
scanner := bufio.NewScanner(bytes.NewReader(b))
79+
var (
80+
currentLine int64
81+
code string
82+
)
83+
84+
for scanner.Scan() {
85+
if currentLine == line-1 {
86+
code += scanner.Text()
87+
break
88+
}
89+
currentLine++
90+
}
91+
92+
return ", code:`" + code + "`"
93+
}

0 commit comments

Comments
 (0)