// Copyright 2022 CloudWeGo Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package raw_struct

// Extension .
func Extension() []string {
	return []string{
		StructLike,
		File,
	}
}

// Substitutions.
// Because text.Templates will not substitute an existing template with an empty one,
// we use insertion points to walk around this problem and achieve deleting templates.
var (
	StructLike = `
{{define "StructLike"}}
{{- $TypeName := .GoName}}
{{InsertionPoint .Category .Name}}
{{- if and Features.ReserveComments .ReservedComments}}{{.ReservedComments}}{{end}}
type {{$TypeName}} struct {
{{- range .Fields}}
	{{- InsertionPoint $.Category $.Name .Name}}
	{{- if and Features.ReserveComments .ReservedComments}}
	{{.ReservedComments}}
	{{- end}}
	{{- if .IsNested}}
		{{.GoTypeName}} {{GenFieldTags . (InsertionPoint $.Category $.Name .Name "tag")}}
	{{else}}
		{{(.GoName)}} {{.GoTypeName}} {{GenFieldTags . (InsertionPoint $.Category $.Name .Name "tag")}}
	{{- end}}
{{- end}}
	{{- if Features.KeepUnknownFields}}
	{{- UseStdLibrary "unknown"}}
	_unknownFields unknown.Fields
	{{- end}}
}

{{- end}}{{/* define "StructLike" */}}
	`
	File = `// Code generated by thriftgo ({{Version}}). DO NOT EDIT.
{{InsertionPoint "bof"}}

package {{.FilePackage}}

import (
	{{InsertionPoint "imports"}}
)

{{template "Constant" .}}

{{- range .Enums}}
{{template "Enum" .}}
{{- end}}

{{- range .Typedefs}}
{{template "Typedef" .}}
{{- end}}

{{- range .Structs}}
{{template "StructLike" .}}
{{- end}}

{{- range .Unions}}
{{template "StructLike" .}}
{{- end}}

{{- range .Exceptions}}
{{template "StructLike" .}}
{{- end}}

{{- InsertionPoint "eof"}}
`
)
