~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
77 lines · 2.5 KB Raw History
package apigen

import (
	"bytes"
	"fmt"
	"go/format"
	"path"
)

const generatedHeader = "// Code generated by socialweb-apigen. DO NOT EDIT.\n\n"

func RegisterFile(m *Model) string {
	return path.Join(m.Dir, "zz_generated.register.go")
}

func ConditionsFile(m *Model) string {
	return path.Join(m.Dir, "zz_generated.conditions.go")
}

func (m *Model) RegisterGo() ([]byte, error) {
	var b bytes.Buffer
	b.WriteString(generatedHeader)
	fmt.Fprintf(&b, "package %s\n\n", m.Package)
	b.WriteString("import (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n)\n\n")
	b.WriteString("var (\n\tSchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)\n\tAddToScheme = SchemeBuilder.AddToScheme\n)\n\n")
	b.WriteString("const (\n")
	for _, r := range m.Resources {
		fmt.Fprintf(&b, "\t%sResource = %q\n", r.Kind, r.Plural)
	}
	b.WriteString(")\n\n")
	b.WriteString("var (\n")
	for _, r := range m.Resources {
		fmt.Fprintf(&b, "\t%sGVR = GroupVersion.WithResource(%sResource)\n", r.Kind, r.Kind)
	}
	b.WriteString(")\n\n")
	b.WriteString("func addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(\n\t\tGroupVersion,\n")
	for _, r := range m.Resources {
		fmt.Fprintf(&b, "\t\t&%s{},\n\t\t&%s{},\n", r.Kind, r.ListKind)
	}
	b.WriteString("\t)\n\tmetav1.AddToGroupVersion(scheme, GroupVersion)\n\treturn nil\n}\n")
	for _, r := range m.Resources {
		for _, name := range []string{r.Kind, r.ListKind} {
			fmt.Fprintf(&b, "\nfunc (in *%s) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n", name)
		}
	}
	return formatGo(RegisterFile(m), b.Bytes())
}

func (m *Model) ConditionsGo() ([]byte, bool, error) {
	var kinds []string
	for _, r := range m.Resources {
		if r.Conditions {
			kinds = append(kinds, r.Kind)
		}
	}
	if len(kinds) == 0 {
		return nil, false, nil
	}
	var b bytes.Buffer
	b.WriteString(generatedHeader)
	fmt.Fprintf(&b, "package %s\n\n", m.Package)
	b.WriteString("import (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n")
	for _, k := range kinds {
		fmt.Fprintf(&b, "\nfunc (in *%s) GetConditions() []metav1.Condition {\n\treturn in.Status.Conditions\n}\n", k)
		fmt.Fprintf(&b, "\nfunc (in *%s) SetConditions(conditions []metav1.Condition) {\n\tin.Status.Conditions = conditions\n}\n", k)
	}
	data, err := formatGo(ConditionsFile(m), b.Bytes())
	return data, true, err
}

func formatGo(name string, src []byte) ([]byte, error) {
	out, err := format.Source(src)
	if err != nil {
		return nil, fmt.Errorf("%s: %w", name, err)
	}
	return out, nil
}