Skip to content

ricdeau/enki

Repository files navigation

enki

MIT license Go Reference CircleCI codecov Go Report Card

enki is a package for easy go files generation

Example

package main

import (
	"os"
	"github.com/ricdeau/enki"
)

const (
	Int     = "int"
	Str     = "string"
	Float32 = "float32"
	Float64 = "float64"
)

func main() {
    f := enki.NewFile()
    f.Package("enki")
    f.GeneratedBy("enki")
    f.Import(".", "fmt")
    f.Import("", "sync")
    
    f.Consts(enki.Field(`DEF = "default"`))
    
    f.Vars(enki.Field(`wg sync.WaitGroup`))
    
    f.Line("// Number type redefined")
    
    f.Add(enki.T("Number").Is(Int))
    f.NewLine()
    
    f.Add(enki.T("NumStruct").Struct(
		enki.Field("a, b " + Int),
    ))
    f.NewLine()
    
    f.Add(enki.T("Num").Interface(
        enki.Def("AsNumber").Returns(Str),
        enki.Def("Sum").Params(Int).Returns(Int),
    ))
    f.NewLine()
    
    f.Add(enki.M("AsNumber").Receiver("n Number").Body(
        enki.Stmt().Line("wg.Add(1)"),
        enki.Stmt().Line("defer wg.Done()"),
        enki.Stmt().Line("return Sprint(n)"),
    ).Returns(Str))
    f.NewLine()
    
    f.Add(enki.M("Sum").Receiver("n Number").Params("x int").Body(
		enki.Stmt().Line("return int(n) + x"),
    ).Returns(Int))
    f.NewLine()
    
    f.Add(enki.M("Sum").Receiver("ns NumStruct").Body(
		enki.Stmt().Line("return ns.a + ns.b"),
    ).Returns(Int))
    f.NewLine()
    
    f.Add(enki.F("sum").Params("a, b " + Float32).Body(
		enki.Stmt().Line("return @1(a + b)", Float64),
    ).Returns("s " + Float64))
    
    _ = f.GoFmt(true).Write(os.Stdout)
}

Output:

// Code generated by enki. DO NOT EDIT.
package enki

import (
	. "fmt"
	"sync"
)

const (
	DEF = "default"
)

var (
	wg sync.WaitGroup
)

// Number type redefined
type Number int

type NumStruct struct {
	a, b int
}

type Num interface {
	AsNumber() string
	Sum(int) int
}

func (n Number) AsNumber() string {
	wg.Add(1)
	defer wg.Done()
	return Sprint(n)
}

func (n Number) Sum(x int) int {
	return int(n) + x
}

func (ns NumStruct) Sum() int {
	return ns.a + ns.b
}

func sum(a, b float32) (s float64) {
	return float64(a + b)
}