Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
BSD 3-Clause License

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

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
Expand Down
58 changes: 58 additions & 0 deletions golang/common_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* Copyright (c) 2025-2026 Mikhail Knyazhev <markus621@yandex.com>. All rights reserved.
* Use of this source code is governed by a BSD 3-Clause license that can be found in the LICENSE file.
*/

package golang_test

import (
"bytes"
"fmt"
"testing"

. "go.osspkg.com/gogen/golang"
)

func Test_newStmt(t *testing.T) {
//SetRawMode()

buf := bytes.NewBuffer(nil)

stmt := Comment("Autogenerate code").
Package("main").
Import("fmt", "fmt").
Import("fmt2", "fmt").
Join(
Func().ID("main").Bracket().Block(
Comment("d").
Var().ID("a").Op("=").
Map(Interface().Block(), Interface().Block(ID("Do").Bracket().Error())).
Block(
Text("a").Op(":").Text("").Op(","),
Array(2).Int8().Op(":").Raw("1").Op(","),
).
Comment("d"),
Var().ID("b").Op("=").New(Int8()),
Var().ID("b").Op("=").Make(Slice().Int8(), 0, 10),
Op("*").ID("aaa").Op("=").Append(Op("*").ID("aaa"), Slice().Byte().Op("...")),
For().List(ID("a"), ID("b")).Op(":=").Range().Pkg("fmt").ID("aa").Block(),
For().Block(
Select().Block(),
),
Switch().ID("aa").Op(".").Bracket(ID("type")).Block(
Case().Slice().Byte().Op(":").Block(
Pkg("fmt").ID("Println").Call(ID("aa")),
),
Default().Op(":"),
),
),
)

if err := Render(buf, stmt); err != nil {
t.Fatal(err)
}

fmt.Println("______________________________")
fmt.Print(buf.String())
fmt.Println("______________________________")
}
14 changes: 7 additions & 7 deletions golang/config.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
/*
* Copyright (c) 2025 Mikhail Knyazhev <markus621@yandex.com>. All rights reserved.
* Copyright (c) 2025-2026 Mikhail Knyazhev <markus621@yandex.com>. All rights reserved.
* Use of this source code is governed by a BSD 3-Clause license that can be found in the LICENSE file.
*/

package golang

import (
config2 "go.osspkg.com/gogen/internal/config"
cfg "go.osspkg.com/gogen/internal/config"
)

var _ config2.Config = (*config)(nil)
var _ cfg.Config = (*config)(nil)

type config struct{}

Expand All @@ -24,15 +24,15 @@ func (c config) OperationAvailable(op string) bool {
}
}

func (config) CommentSingle() config2.OpenClose {
return config2.OpenClose{
func (config) CommentSingle() cfg.OpenClose {
return cfg.OpenClose{
Open: "//",
Close: "\n",
}
}

func (config) CommentMulti() config2.OpenClose {
return config2.OpenClose{
func (config) CommentMulti() cfg.OpenClose {
return cfg.OpenClose{
Open: "/*\n",
Close: "\n*/\n",
}
Expand Down
72 changes: 68 additions & 4 deletions golang/render.go
Original file line number Diff line number Diff line change
@@ -1,29 +1,93 @@
/*
* Copyright (c) 2025 Mikhail Knyazhev <markus621@yandex.com>. All rights reserved.
* Copyright (c) 2025-2026 Mikhail Knyazhev <markus621@yandex.com>. All rights reserved.
* Use of this source code is governed by a BSD 3-Clause license that can be found in the LICENSE file.
*/

package golang

import (
"bufio"
"bytes"
"fmt"
"go/format"
"io"
"regexp"
"strconv"
"sync/atomic"

"go.osspkg.com/gogen/types"
)

var rawMode = atomic.Bool{}

func SetRawMode() {
rawMode.Store(true)
}

func SetDefaultMode() {
rawMode.Store(false)
}

func Render(w io.Writer, arg types.Token) error {
buf := bytes.NewBuffer(nil)

if err := arg.Render(buf); err != nil {
return err
}
b, err := format.Source(buf.Bytes())
if err != nil {
return err

var (
b []byte
err error
)

if rawMode.Load() {
b = buf.Bytes()
} else {
if b, err = format.Source(buf.Bytes()); err != nil {
return fmt.Errorf(
"gofmt error: %w%s",
err, getBadCode(buf.Bytes(), err),
)
}
}

if _, err = w.Write(b); err != nil {
return err
}

return nil
}

var rex = regexp.MustCompile(`(?iU)^(\d+)\:(\d+)\:`)

func getBadCode(b []byte, err error) string {
if err == nil {
return ""
}

found := rex.FindStringSubmatch(err.Error())
if len(found) != 3 {
return ""
}

line, err := strconv.ParseInt(found[1], 10, 64)
if err != nil {
return ""
}

scanner := bufio.NewScanner(bytes.NewReader(b))
var (
currentLine int64
code string
)

for scanner.Scan() {
if currentLine == line-1 {
code += scanner.Text()
break
}
currentLine++
}

return ", code:`" + code + "`"
}
Loading
Loading