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 }