mirror of
https://github.com/ent/ent.git
synced 2026-05-24 09:31:56 +03:00
* Update ent.tmpl Fixed a small typo * allow customization of stringer implementation * remove "model/stringer" from ExtendPatterns
174 lines
6.3 KiB
Cheetah
174 lines
6.3 KiB
Cheetah
{{/*
|
|
Copyright 2019-present Facebook Inc. All rights reserved.
|
|
This source code is licensed under the Apache 2.0 license found
|
|
in the LICENSE file in the root directory of this source tree.
|
|
*/}}
|
|
|
|
{{ define "model" }}
|
|
|
|
{{ $pkg := base $.Config.Package }}
|
|
{{ template "header" $ }}
|
|
|
|
{{ template "import" $ }}
|
|
|
|
import (
|
|
{{- range $path := $.SiblingImports }}
|
|
"{{ $path }}"
|
|
{{- end }}
|
|
)
|
|
|
|
// {{ $.Name }} is the model entity for the {{ $.Name }} schema.
|
|
type {{ $.Name }} struct {
|
|
config {{ template "model/omittags" $ }}
|
|
// ID of the ent.
|
|
ID {{ $.ID.Type }} {{ with $.Annotations.Fields.StructTag.id }}`{{ . }}`{{ else }}`{{ $.ID.StructTag }}`{{ end }}
|
|
{{- range $f := $.Fields }}
|
|
{{- $tag := $f.StructTag }}{{ with $tags := $.Annotations.Fields.StructTag }}{{ with index $tags $f.Name }}{{ $tag = . }}{{ end }}{{ end }}
|
|
// {{ $f.StructField }} holds the value of the "{{ $f.Name }}" field.
|
|
{{ $f.StructField }} {{ if $f.Nillable }}*{{ end }}{{ $f.Type }} {{ if not $f.Sensitive }}`{{ $tag }}`{{ else }}{{ template "model/omittags" $ }}{{ end }}
|
|
{{- end }}
|
|
{{- with $.Edges }}
|
|
// Edges holds the relations/edges for other nodes in the graph.
|
|
// The values are being populated by the {{ $.Name }}Query when eager-loading is set.
|
|
Edges {{ $.Name }}Edges {{ template "model/edgetags" $ }}
|
|
{{- end -}}
|
|
{{- /* Additional fields to add by the storage driver. */}}
|
|
{{- $tmpl := printf "dialect/%s/model/fields" $.Storage }}
|
|
{{- if hasTemplate $tmpl }}
|
|
{{- xtemplate $tmpl . }}
|
|
{{- end }}
|
|
{{- /* Additional fields to add by the user. */}}
|
|
{{ template "model/fields/additional" $ }}
|
|
}
|
|
|
|
{{- with $.Edges }}
|
|
// {{ $.Name }}Edges holds the relations/edges for other nodes in the graph.
|
|
type {{ $.Name }}Edges struct {
|
|
{{- range $e := . }}
|
|
// {{ $e.StructField }} holds the value of the {{ $e.Name }} edge.
|
|
{{ $e.StructField }} {{ if not $e.Unique }}[]{{ end }}*{{ $e.Type.Name }} {{ with $e.StructTag }}`{{ . }}`{{ end }}
|
|
{{- end }}
|
|
// loadedTypes holds the information for reporting if a
|
|
// type was loaded (or requested) in eager-loading or not.
|
|
loadedTypes [{{ len . }}]bool
|
|
}
|
|
|
|
{{- range $i, $e := . }}
|
|
// {{ $e.StructField }}OrErr returns the {{ $e.StructField }} value or an error if the edge
|
|
// was not loaded in eager-loading{{ if $e.Unique }}, or loaded but was not found{{ end }}.
|
|
func (e {{ $.Name }}Edges) {{ $e.StructField }}OrErr() ({{ if not $e.Unique }}[]{{ end }}*{{ $e.Type.Name }}, error) {
|
|
if e.loadedTypes[{{ $i }}] {
|
|
{{- if $e.Unique }}
|
|
if e.{{ $e.StructField }} == nil {
|
|
// The edge {{ $e.Name }} was loaded in eager-loading,
|
|
// but was not found.
|
|
return nil, &NotFoundError{label: {{ $e.Type.Package }}.Label}
|
|
}
|
|
{{- end }}
|
|
return e.{{ $e.StructField }}, nil
|
|
}
|
|
return nil, &NotLoadedError{edge: "{{ $e.Name }}"}
|
|
}
|
|
{{- end }}
|
|
{{- end }}
|
|
|
|
{{ $tmpl = printf "dialect/%s/decode/one" $.Storage }}
|
|
{{ xtemplate $tmpl $ }}
|
|
|
|
{{ $receiver := $.Receiver }}
|
|
|
|
{{ range $e := $.Edges }}
|
|
{{ $func := print "Query" $e.StructField }}
|
|
// {{ $func }} queries the {{ $e.Name }} edge of the {{ $.Name }}.
|
|
func ({{ $receiver }} *{{ $.Name }}) {{ $func }}() *{{ $e.Type.QueryName }} {
|
|
return (&{{ $.Name }}Client{config: {{ $receiver }}.config}).{{ $func }}({{ $receiver }})
|
|
}
|
|
{{ end }}
|
|
|
|
// Update returns a builder for updating this {{ $.Name }}.
|
|
// Note that, you need to call {{ $.Name }}.Unwrap() before calling this method, if this {{ $.Name }}
|
|
// was returned from a transaction, and the transaction was committed or rolled back.
|
|
func ({{ $receiver }} *{{ $.Name }}) Update() *{{ $.UpdateOneName }} {
|
|
return (&{{ $.Name }}Client{config: {{ $receiver }}.config}).UpdateOne({{ $receiver }})
|
|
}
|
|
|
|
// Unwrap unwraps the entity that was returned from a transaction after it was closed,
|
|
// so that all next queries will be executed through the driver which created the transaction.
|
|
func ({{ $receiver }} *{{ $.Name }}) Unwrap() *{{ $.Name }} {
|
|
tx, ok := {{ $receiver }}.config.driver.(*txDriver)
|
|
if !ok {
|
|
panic("{{ $pkg }}: {{ $.Name }} is not a transactional entity")
|
|
}
|
|
{{ $receiver }}.config.driver = tx.drv
|
|
return {{ $receiver }}
|
|
}
|
|
|
|
{{ template "model/stringer" $ }}
|
|
|
|
{{ $slice := plural $.Name }}
|
|
// {{ $slice }} is a parsable slice of {{ $.Name }}.
|
|
type {{ $slice }} []*{{ $.Name }}
|
|
|
|
{{ with extend $ "Slice" $slice }}
|
|
{{ $tmpl := printf "dialect/%s/decode/many" $.Storage }}
|
|
{{ xtemplate $tmpl . }}
|
|
{{ end }}
|
|
|
|
func ({{ $receiver }} {{ $slice }}) config(cfg config) {
|
|
for _i := range {{ $receiver }} {
|
|
{{ $receiver }}[_i].config = cfg
|
|
}
|
|
}
|
|
{{ end }}
|
|
|
|
{{/* A template to generate a fmt.Stringer implementation. */}}
|
|
{{ define "model/stringer" }}
|
|
{{ $receiver := $.Receiver }}
|
|
|
|
// String implements the fmt.Stringer.
|
|
func ({{ $receiver }} *{{ $.Name }}) String() string {
|
|
var builder strings.Builder
|
|
builder.WriteString("{{ $.Name }}(")
|
|
builder.WriteString(fmt.Sprintf("id=%v", {{ $receiver }}.ID))
|
|
{{- range $i, $f := $.Fields }}
|
|
{{- if $f.Sensitive }}
|
|
builder.WriteString(", {{ $f.Name }}=<sensitive>")
|
|
{{- else }}
|
|
{{- $sf := printf "%s.%s" $receiver $f.StructField }}
|
|
{{- if $f.Nillable }}
|
|
if v := {{ $sf }}; v != nil {
|
|
builder.WriteString(", {{ $f.Name }}=")
|
|
{{- if and $f.IsTime (not $f.HasGoType) }}
|
|
builder.WriteString(v.Format(time.ANSIC))
|
|
{{- else if and $f.IsString (not $f.HasGoType) }}
|
|
builder.WriteString(*v)
|
|
{{- else }}
|
|
builder.WriteString(fmt.Sprintf("%v", *v))
|
|
{{- end }}
|
|
}
|
|
{{- else }}
|
|
builder.WriteString(", {{ $f.Name }}=")
|
|
{{- if and $f.IsTime (not $f.HasGoType) }}
|
|
builder.WriteString({{ $sf }}.Format(time.ANSIC))
|
|
{{- else if and $f.IsString (not $f.HasGoType) }}
|
|
builder.WriteString({{ $sf }})
|
|
{{- else }}
|
|
builder.WriteString(fmt.Sprintf("%v", {{ $sf }}))
|
|
{{- end }}
|
|
{{- end }}
|
|
{{- end }}
|
|
{{- end }}
|
|
builder.WriteByte(')')
|
|
return builder.String()
|
|
}
|
|
{{ end }}
|
|
|
|
{{/* A template for generating the tag of the Edges struct-field. */}}
|
|
{{ define "model/edgetags" }}{{ with $.Annotations.Edges.StructTag }}`{{ . }}`{{ else }}`json:"edges"`{{ end }}{{ end }}
|
|
|
|
{{/* A template for omitting struct-tags. */}}
|
|
{{ define "model/omittags" }}{{ with $.TagTypes }}`{{ range $i, $t := . }}{{ if ne $i 0 }} {{ end }}{{ $t }}:"-"{{ end }}`{{ end }}{{ end }}
|
|
|
|
{{/* A template that can be overridden in order to add additional fields to the each type.*/}}
|
|
{{ define "model/fields/additional" }}{{end}}
|