{{/* 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. */}} {{/* gotype: entgo.io/ent/entc/gen.Type */}} {{ define "setter" }} {{ $builder := pascal $.Scope.Builder }} {{ $receiver := $.Scope.Receiver }} {{ $fields := $.Fields }} {{ $updater := false }} {{ $creator := true }} {{- if or (hasSuffix $builder "Update") (hasSuffix $builder "UpdateOne") }} {{ $updater = true }} {{ $creator = false }} {{ $fields = $.MutableFields }} {{- else if $.HasCompositeID }} {{- else if $.ID.UserDefined }} {{ $fields = append $fields $.ID }} {{- end }} {{ range $f := $fields }} {{- if $f.IsBlob }}{{ continue }}{{ end }} {{ $func := print "Set" $f.StructField }} // {{ $func }} sets the "{{ $f.Name }}" field. func ({{ $receiver }} *{{ $builder }}) {{ $func }}(v {{ $f.Type }}) *{{ $builder }} { {{- /* setting numeric type override previous calls to Add. */}} {{- if and $updater $f.SupportsMutationAdd }} {{ $receiver }}.mutation.{{ $f.MutationReset }}() {{- end }} {{ $receiver }}.mutation.{{ $f.MutationSet }}(v) return {{ $receiver }} } {{/* Avoid generating nillable setters for nillable types. */}} {{ $nillableC := and $creator (or $f.Optional $f.Default) }} {{ $nillableU := and $updater (not $f.UpdateDefault) }} {{ $nillableFunc := print "SetNillable" $f.StructField }} {{ $skipNillable := false }}{{ range $fields }}{{ if and (ne .Name $f.Name) (eq .MutationSet $nillableFunc) }}{{ $skipNillable = true }}{{ break }}{{ end }}{{ end }} {{ if and (not $f.Type.Nillable) (not $skipNillable) (or $nillableC $nillableU) }} // {{ $nillableFunc }} sets the "{{ $f.Name }}" field if the given value is not nil. func ({{ $receiver }} *{{ $builder }}) {{ $nillableFunc }}(v *{{ $f.Type }}) *{{ $builder }} { if v != nil { {{ $receiver }}.{{ $func }}(*v) } return {{ $receiver }} } {{ end }} {{ if and $updater $f.SupportsMutationAdd }} // {{ $f.MutationAdd }} adds value to the "{{ $f.Name }}" field. func ({{ $receiver }} *{{ $builder }}) {{ $f.MutationAdd }}(v {{ $f.SignedType }}) *{{ $builder }} { {{ $receiver }}.mutation.{{ $f.MutationAdd }}(v) return {{ $receiver }} } {{ end }} {{ if and $updater $f.SupportsMutationAppend }} // {{ $f.MutationAppend }} appends value to the "{{ $f.Name }}" field. func ({{ $receiver }} *{{ $builder }}) {{ $f.MutationAppend }}(v {{ $f.Type }}) *{{ $builder }} { {{ $receiver }}.mutation.{{ $f.MutationAppend }}(v) return {{ $receiver }} } {{ end }} {{ if and $f.Optional $updater }} {{ $func := print "Clear" $f.StructField }} // {{ $func }} clears the value of the "{{ $f.Name }}" field. func ({{ $receiver }} *{{ $builder }}) {{ $func }}() *{{ $builder }} { {{ $receiver }}.mutation.{{ $func }}() return {{ $receiver }} } {{ end }} {{ end }} {{- range $f := $.BlobFields }} {{ $func := print "Set" $f.StructField }} // {{ $func }} sets the "{{ $f.Name }}" field. func ({{ $receiver }} *{{ $builder }}) {{ $func }}(v io.Reader) *{{ $builder }} { {{ $receiver }}.mutation.Set{{ $f.StructField }}(v) return {{ $receiver }} } {{- if and $f.Optional $updater }} {{ $clearFunc := print "Clear" $f.StructField }} // {{ $clearFunc }} clears the value of the "{{ $f.Name }}" field. func ({{ $receiver }} *{{ $builder }}) {{ $clearFunc }}() *{{ $builder }} { {{ $receiver }}.mutation.{{ $clearFunc }}() return {{ $receiver }} } {{- end }} {{- end }} {{ range $e := $.EdgesWithID }} {{ if and $updater $e.Immutable }} {{/* Skip to the next one as immutable edges cannot be updated. */}} {{continue}} {{ end }} {{ $op := "add" }}{{ $idsFunc := $e.MutationAdd }}{{ if $e.Unique }}{{ $op = "set" }}{{ $idsFunc = $e.MutationSet }}{{ end }} {{/* Check if this setter was already defined by the field-setters (e.g. edge-field with the same name). */}} {{ $withSetter := not $e.HasFieldSetter }} {{ if $withSetter }} // {{ $idsFunc }} {{ $op }}s the "{{ $e.Name }}" edge to the {{ $e.Type.Name }} entity by ID{{ if not $e.Unique }}s{{ end }}. func ({{ $receiver }} *{{ $builder }}) {{ $idsFunc }}({{ if $e.Unique }}id{{ else }}ids ...{{ end }} {{ $e.Type.ID.Type }}) *{{ $builder }} { {{ $receiver }}.mutation.{{ $idsFunc }}({{ if $e.Unique }}id{{ else }}ids ...{{ end }}) return {{ $receiver }} } {{ end }} {{ if and $e.Unique $e.Optional $withSetter }} {{ $nillableIDsFunc := print "SetNillable" $e.StructField "ID" }} // {{ $nillableIDsFunc }} sets the "{{ $e.Name }}" edge to the {{ $e.Type.Name }} entity by ID if the given value is not nil. func ({{ $receiver }} *{{ $builder }}) {{ $nillableIDsFunc }}(id *{{ $e.Type.ID.Type }}) *{{ $builder }} { if id != nil { {{ $receiver}} = {{ $receiver }}.{{ $idsFunc }}(*id) } return {{ $receiver }} } {{ end }} {{ $func := print (pascal $op) $e.StructField }} // {{ $func }} {{ $op }}s the "{{ $e.Name }}" edge{{if not $e.Unique}}s{{ end }} to the {{ $e.Type.Name }} entity. func ({{ $receiver }} *{{ $builder }}) {{ $func }}(v {{ if not $e.Unique }}...{{ end }}*{{ $e.Type.Name}}) *{{ $builder }} { {{ if $e.Unique -}} return {{ $receiver }}.{{ $idsFunc }}(v.ID) {{- else -}} ids := make([]{{ $e.Type.ID.Type }}, len(v)) for i := range v { ids[i] = v[i].ID } return {{ $receiver }}.{{ $idsFunc }}(ids...) {{- end }} } {{ end }} // Mutation returns the {{ $.MutationName }} object of the builder. func ({{ $receiver }} *{{ $builder }}) Mutation() *{{ $.MutationName }} { return {{ $receiver }}.mutation } {{ end }}