{{/* 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 "meta" }} {{- with extend $ "Package" $.Package -}} {{ template "header" . }} {{ end }} {{ template "import" $ }} const ( // Label holds the string label denoting the {{ lower $.Name }} type in the database. Label = "{{ $.Label }}" // {{ $.ID.Constant }} holds the string denoting the id field in the database. {{ $.ID.Constant }} = "{{ $.ID.StorageKey }}" {{ range $_, $f := $.Fields -}}{{ $field := $f.Constant -}} // {{ $field }} holds the string denoting the {{ lower $f.Name }} vertex property in the database. {{ $field }} = "{{ $f.StorageKey }}" {{ end -}} {{ $tmpl := printf "dialect/%s/meta/constants" $.Storage }} {{ xtemplate $tmpl $ }} ) {{ $tmpl = printf "dialect/%s/meta/variables" $.Storage }} {{ if hasTemplate $tmpl }} {{ xtemplate $tmpl $ }} {{ end }} {{ if or $.HasDefault $.HasValidators }} var ( {{- with $.MixedInWithDefaultOrValidator }} mixin = {{ base $.Schema }}.{{ $.Name }}{}.Mixin() mixinFields = [...][]ent.Field{ {{- range $i, $_ := xrange $.NumMixin }} mixin[{{ $i }}].Fields(), {{- end }} } {{- end }} fields = {{ base $.Schema }}.{{ $.Name }}{}.Fields() {{ range $i, $f := $.Fields -}} {{- $desc := print "desc" $f.StructField -}} {{- /* enum default values handled near their declarations. */}} {{ if or (and $f.Default (not $f.IsEnum)) $f.UpdateDefault $f.Validators -}} {{- if $f.Position.MixedIn }} // {{ $desc }} is the schema descriptor for {{ $f.Name }} field. {{ $desc }} = mixinFields[{{ $f.Position.MixinIndex }}][{{ $f.Position.Index }}].Descriptor() {{- else }} // {{ $desc }} is the schema descriptor for {{ $f.Name }} field. {{ $desc }} = fields[{{ $f.Position.Index }}].Descriptor() {{- end }} {{ end -}} {{ if and $f.Default (not $f.IsEnum) }} {{- $default := $f.DefaultName -}} // {{ $default }} holds the default value on creation for the {{ $f.Name }} field. {{ $default }} = {{ $desc }}.Default.({{ if or $f.IsTime $f.IsUUID }}func() {{ end }}{{ $f.Type }}) {{ end -}} {{ if $f.UpdateDefault }} {{- $default := $f.UpdateDefaultName -}} // {{ $default }} holds the default value on update for the {{ $f.Name }} field. {{ $default }} = {{ $desc }}.UpdateDefault.({{ if $f.IsTime }}func() {{ end }}{{ $f.Type }}) {{ end -}} {{ with $f.Validators -}} {{ $name := $f.Validator -}} {{ $type := printf "func (%s) error" $f.Type -}} // {{ $name }} is a validator for the "{{ $f.Name }}" field. It is called by the builders before save. {{ if eq $f.Validators 1 -}} {{ $name }} = {{ $desc }}.Validators[0].({{ $type }}) {{ else -}} {{ $name }} = func() {{ $type }} { validators := {{ $desc }}.Validators fns := [...]func({{ $f.Type }}) error { {{- range $j, $n := xrange $f.Validators }} validators[{{ $j }}].(func({{ $f.Type }}) error), {{- end }} } return func({{ $f.BuilderField }} {{ $f.Type }}) error { for _, fn := range fns { if err := fn({{ $f.BuilderField }}); err != nil { return err } } return nil } }() {{ end -}} {{ end -}} {{ end -}} ) {{ end }} {{/* define custom type for enum fields */}} {{ range $_, $f := $.Fields -}} {{ if $f.IsEnum }} {{/* omit the package name from the type. */}} {{ $enum := trimPackage $f.Type.String $.Package }} // {{ $enum }} defines the type for the {{ $f.Name }} enum field. type {{ $enum }} string {{- if $f.Default }} {{- /* find the enum that holds the default value. */ -}} {{- range $_, $e := $f.Enums }} {{- if eq $e $f.DefaultValue }} {{- $name := $f.EnumName $e }} // {{ $name }} is the default {{ $enum }}. const {{ $f.DefaultName }} = {{ $name }} {{- end }} {{- end }} {{- end }} // {{ $enum }} values. const ( {{- range $_, $e := $f.Enums }} {{ $f.EnumName $e }} {{ $enum }} = "{{ $e }}" {{- end }} ) func (s {{ $enum }}) String() string { return string(s) } {{ $name := $f.Validator -}} {{ $arg := receiver $f.BuilderField }} // {{ $name }} is a validator for the "{{ $arg }}" field enum values. It is called by the builders before save. func {{ $name }}({{ $arg }} {{ $enum }}) error { switch {{ $arg }} { case {{ range $i, $e := $f.Enums }}{{ if ne $i 0 }},{{ end }}{{ $f.StructField }}{{ pascal $e }}{{ end }}: return nil default: return fmt.Errorf("{{ $.Package }}: invalid enum value for {{ $f.Name }} field: %q", {{ $arg }}) } } {{ end }} {{ end }} {{ template "meta/additional" $ }} {{ end }} {{/* A template that can be overrided in order to add additional code for the type package. */}} {{ define "meta/additional" }}{{ end }}