Documentation ¶
Overview ¶
Package gen is the interface for generating loaded schemas into a Go package.
Index ¶
- Variables
- func PrepareEnv(c *Config) (undo func() error, err error)
- type Config
- type Edge
- func (e Edge) BuilderField() string
- func (e Edge) ColumnConstant() string
- func (e Edge) Constant() string
- func (e Edge) HasConstraint() bool
- func (e Edge) InverseLabelConstant() string
- func (e Edge) InverseTableConstant() string
- func (e Edge) IsInverse() bool
- func (e Edge) Label() string
- func (e Edge) LabelConstant() string
- func (e Edge) M2M() bool
- func (e Edge) M2O() bool
- func (e Edge) MutationReset() string
- func (e Edge) O2M() bool
- func (e Edge) O2O() bool
- func (e Edge) OwnFK() bool
- func (e Edge) PKConstant() string
- func (e Edge) StructFKField() string
- func (e Edge) StructField() string
- func (e Edge) TableConstant() string
- type Enum
- type Field
- func (f Field) BasicType(ident string) (expr string)
- func (f Field) BuilderField() string
- func (f Field) Column() *schema.Column
- func (f Field) Constant() string
- func (f Field) ConvertedToBasic() bool
- func (f Field) DefaultName() string
- func (f Field) DefaultValue() interface{}
- func (f Field) EnumName(enum string) string
- func (f Field) EnumNames() []string
- func (f Field) EnumValues() []string
- func (f Field) HasGoType() bool
- func (f Field) IsBool() bool
- func (f Field) IsEnum() bool
- func (f Field) IsInt() bool
- func (f Field) IsJSON() bool
- func (f Field) IsString() bool
- func (f Field) IsTime() bool
- func (f Field) IsUUID() bool
- func (f Field) MutationGet() string
- func (f Field) MutationGetOld() string
- func (f Field) MutationReset() string
- func (f Field) NullType() string
- func (f Field) NullTypeField(rec string) string
- func (f Field) PK() *schema.Column
- func (f Field) Sensitive() bool
- func (f Field) StorageKey() string
- func (f Field) StructField() string
- func (f Field) UpdateDefaultName() string
- func (f Field) Validator() string
- type ForeignKey
- type Graph
- type GraphTemplate
- type Index
- type Op
- type Rel
- type Relation
- type SchemaMode
- type Storage
- type Type
- func (t *Type) AddIndex(idx *load.Index) error
- func (t Type) CreateBulkName() string
- func (t Type) CreateName() string
- func (t Type) DeleteName() string
- func (t Type) DeleteOneName() string
- func (t Type) EnumFields() []*Field
- func (t Type) FKEdges() (edges []*Edge)
- func (t Type) HasAssoc(name string) (*Edge, bool)
- func (t Type) HasDefault() bool
- func (t Type) HasNumeric() bool
- func (t Type) HasOptional() bool
- func (t Type) HasPolicy() bool
- func (t Type) HasUpdateDefault() bool
- func (t Type) HasValidators() bool
- func (t Type) HookPositions() []*load.Position
- func (t Type) Label() string
- func (t Type) MixedInFields() []int
- func (t Type) MixedInHooks() []int
- func (t Type) MutableFields() []*Field
- func (t Type) MutationName() string
- func (t Type) NumConstraint() int
- func (t Type) NumHooks() int
- func (t Type) NumM2M() int
- func (t Type) NumMixin() int
- func (t Type) Package() string
- func (t Type) QueryName() string
- func (t Type) Receiver() string
- func (t Type) RelatedTypes() []*Type
- func (t Type) RuntimeMixin() bool
- func (t Type) SiblingImports() []string
- func (t Type) Table() string
- func (t Type) TagTypes() []string
- func (t Type) UpdateName() string
- func (t Type) UpdateOneName() string
- type TypeTemplate
Constants ¶
This section is empty.
Variables ¶
var ( // Templates holds the template information for a file that the graph is generating. Templates = []TypeTemplate{ { Name: "create", Format: pkgf("%s_create.go"), }, { Name: "update", Format: pkgf("%s_update.go"), }, { Name: "delete", Format: pkgf("%s_delete.go"), }, { Name: "query", Format: pkgf("%s_query.go"), }, { Name: "model", Format: pkgf("%s.go"), }, { Name: "where", Format: pkgf("%s/where.go"), }, { Name: "meta", Format: func(t *Type) string { return fmt.Sprintf("%s/%s.go", t.Package(), t.Package()) }, ExtendPattern: "meta/additional/*", }, } // GraphTemplates holds the templates applied on the graph. GraphTemplates = []GraphTemplate{ { Name: "base", Format: "ent.go", }, { Name: "client", Format: "client.go", }, { Name: "context", Format: "context.go", }, { Name: "tx", Format: "tx.go", }, { Name: "config", Format: "config.go", }, { Name: "mutation", Format: "mutation.go", }, { Name: "migrate", Format: "migrate/migrate.go", Skip: func(g *Graph) bool { return !g.SupportMigrate() }, }, { Name: "schema", Format: "migrate/schema.go", Skip: func(g *Graph) bool { return !g.SupportMigrate() }, }, { Name: "predicate", Format: "predicate/predicate.go", }, { Name: "hook", Format: "hook/hook.go", }, { Name: "privacy", Format: "privacy/privacy.go", }, { Name: "runtime/ent", Format: "runtime.go", }, { Name: "enttest", Format: "enttest/enttest.go", }, { Name: "runtime/pkg", Format: "runtime/runtime.go", }, } )
var ( // Funcs are the predefined template // functions used by the codegen. Funcs = template.FuncMap{ "ops": ops, "add": add, "append": reflect.Append, "appends": reflect.AppendSlice, "order": order, "camel": camel, "snake": snake, "pascal": pascal, "extend": extend, "xrange": xrange, "receiver": receiver, "plural": plural, "aggregate": aggregate, "primitives": primitives, "singular": rules.Singularize, "quote": strconv.Quote, "base": filepath.Base, "keys": keys, "join": join, "lower": strings.ToLower, "upper": strings.ToUpper, "hasField": hasField, "hasImport": hasImport, "indirect": indirect, "hasPrefix": strings.HasPrefix, "hasSuffix": strings.HasSuffix, "trimPackage": trimPackage, "xtemplate": xtemplate, "hasTemplate": hasTemplate, "matchTemplate": matchTemplate, "split": strings.Split, "tagLookup": tagLookup, "toString": toString, "dict": dict, "get": get, "set": set, "unset": unset, "hasKey": hasKey, "list": list, "fail": fail, "replace": strings.ReplaceAll, } )
Functions ¶
func PrepareEnv ¶
PrepareEnv makes sure the generated directory (environment) is suitable for loading the `ent` package (avoid cyclic imports).
Types ¶
type Config ¶
type Config struct { // Schema is the package path for the schema package. Schema string // Target is the filepath for the directory that holds the generated code. Target string // Package path for the targeted directory that holds the generated code. Package string // Header is an optional header signature for generated files. Header string // Storage to support in codegen. Storage *Storage // IDType specifies the type of the id field in the codegen. // The supported types are string and int, which also the default. IDType *field.TypeInfo // Template specifies an alternative template to execute or to override // the default. If nil, the default template is used. // // Note that, additional templates are executed on the Graph object and // the execution output is stored in a file derived by the template name. Template *template.Template }
Config for global codegen to be shared between all nodes.
func (Config) ModuleInfo ¶
ModuleInfo returns the entc binary module version.
type Edge ¶
type Edge struct { // Name holds the name of the edge. Name string // Type holds a reference to the type this edge is directed to. Type *Type // Optional indicates is this edge is optional on create. Optional bool // Unique indicates if this edge is a unique edge. Unique bool // Inverse holds the name of the reference edge declared in the schema. Inverse string // Owner holds the type of the edge-owner. For assoc-edges it's the // type that holds the edge, for inverse-edges, it's the assoc type. Owner *Type // StructTag of the edge-field in the struct. default to "json". StructTag string // Relation holds the relation info of an edge. Rel Relation // Bidi indicates if this edge is a bidirectional edge. A self-reference // to the same type with the same name (symmetric relation). For example, // a User type have one of following edges: // // edge.To("friends", User.Type) // many 2 many. // edge.To("spouse", User.Type).Unique() // one 2 one. // Bidi bool // Annotations that were defined for the edge in the schema. // The mapping is from the Annotation.Name() to a JSON decoded object. Annotations map[string]interface{} // contains filtered or unexported fields }
Edge of a graph between two types.
func (Edge) BuilderField ¶
BuilderField returns the struct member of the edge in the builder.
func (Edge) ColumnConstant ¶
ColumnConstant returns the constant name of the relation column.
func (Edge) HasConstraint ¶
HasConstraint indicates if this edge has a unique constraint check. We check uniqueness when both-directions are unique or one of them. Used by the Gremlin storage-layer.
func (Edge) InverseLabelConstant ¶
InverseConstant returns the inverse constant name of the edge.
func (Edge) InverseTableConstant ¶
InverseTableConstant returns the constant name of the other/inverse type of the relation.
func (Edge) LabelConstant ¶
Constant returns the constant name of the edge for the gremlin dialect. If the edge is inverse, it returns the constant name of the owner-edge (assoc-edge).
func (Edge) MutationReset ¶
MutationReset returns the method name for resetting the edge value. The default name is "Reset<EdgeName>". If the the method conflicts with the mutation methods, suffix the method with "Edge".
func (Edge) OwnFK ¶
OwnFK indicates if the foreign-key of this edge is owned by the edge column (reside in the type's table). Used by the SQL storage-driver.
func (Edge) PKConstant ¶
PKConstant returns the constant name of the primary key. Used for M2M edges.
func (Edge) StructFKField ¶
StructFKField returns the struct member for holding the edge foreign-key in the model.
func (Edge) StructField ¶
StructField returns the struct member of the edge in the model.
func (Edge) TableConstant ¶
TableConstant returns the constant name of the relation table.
type Enum ¶
type Enum struct { // Name is the Go name of the enum. Name string // Value in the schema. Value string }
Enum holds the enum information for schema enums in codegen.
type Field ¶
type Field struct { // Name is the name of this field in the database schema. Name string // Type holds the type information of the field. Type *field.TypeInfo // Unique indicate if this field is a unique field. Unique bool // Optional indicates is this field is optional on create. Optional bool // Nillable indicates that this field can be null in the // database and pointer in the generated entities. Nillable bool // Default indicates if this field has a default value for creation. Default bool // Enums information for enum fields. Enums []Enum // UpdateDefault indicates if this field has a default value for update. UpdateDefault bool // Immutable indicates is this field cannot be updated. Immutable bool // StructTag of the field. default to "json". StructTag string // Validators holds the number of validators this field have. Validators int // Position info of the field. Position *load.Position // UserDefined indicates that this field was defined by the loaded schema. // Unlike default id field, which is defined by the generator. UserDefined bool // Annotations that were defined for the field in the schema. // The mapping is from the Annotation.Name() to a JSON decoded object. Annotations map[string]interface{} // contains filtered or unexported fields }
Field holds the information of a type field used for the templates.
func (Field) BasicType ¶
BasicType returns a Go expression for the given identifier to convert it to a basic type. For example:
v (http.Dir) => string(v) v (fmt.Stringer) => v.String() v (database/sql.NullString) => v.String
func (Field) BuilderField ¶
BuilderField returns the struct member of the field in the builder.
func (Field) Column ¶
Column returns the table column. It sets it as a primary key (auto_increment) in case of ID field.
func (Field) ConvertedToBasic ¶
ConvertedToBasic indicates if the Go type of the field can be converted to basic type (string, int, etc).
func (Field) DefaultName ¶
DefaultName returns the variable name of the default value of this field.
func (Field) DefaultValue ¶
func (f Field) DefaultValue() interface{}
DefaultValue returns the default value of the field. Invoked by the template.
func (Field) EnumValues ¶
EnumValues returns the values of the enum field.
func (Field) HasGoType ¶
HasGoType indicate if a basic field (like string or bool) has a custom GoType.
func (Field) MutationGet ¶
MutationGet returns the method name for getting the field value. The default name is just a pascal format. If the the method conflicts with the mutation methods, prefix the method with "Get".
func (Field) MutationGetOld ¶
MutationGetOld returns the method name for getting the old value of a field.
func (Field) MutationReset ¶
MutationReset returns the method name for resetting the field value. The default name is "Reset<FieldName>". If the the method conflicts with the mutation methods, suffix the method with "Field".
func (Field) NullTypeField ¶
NullTypeField extracts the nullable type field (if exists) from the given receiver. It also does the type conversion if needed.
func (Field) StorageKey ¶
StorageKey returns the storage name of the field. SQL column or Gremlin property.
func (Field) StructField ¶
StructField returns the struct member of the field in the model.
func (Field) UpdateDefaultName ¶
UpdateDefaultName returns the variable name of the update default value of this field.
type ForeignKey ¶
type ForeignKey struct { // Field information for the foreign-key column. Field *Field // Edge that is associated with this foreign-key. Edge *Edge }
ForeignKey holds the information for foreign-key columns of types. It's exported only because it's used by the codegen templates and should not be used beside that.
type Graph ¶
type Graph struct { *Config // Nodes are list of Go types that mapped to the types in the loaded schema. Nodes []*Type // Schemas holds the raw interfaces for the loaded schemas. Schemas []*load.Schema }
Graph holds the nodes/entities of the loaded graph schema. Note that, it doesn't hold the edges of the graph. Instead, each Type holds the edges for other Types.
func NewGraph ¶
NewGraph creates a new Graph for the code generation from the given schema definitions. It fails if one of the schemas is invalid.
func (*Graph) SupportMigrate ¶
SupportMigrate reports if the codegen supports schema migration.
type GraphTemplate ¶
type GraphTemplate struct { Name string // template name. Skip func(*Graph) bool // skip condition. Format string // file name format. }
GraphTemplate specifies a template that is executed with the Graph object.
type Index ¶
type Index struct { // Name of the index. One column index is simply the column name. Name string // Unique index or not. Unique bool // Columns are the table columns. Columns []string }
Index represents a database index used for either increasing speed on database operations or defining constraints such as "UNIQUE INDEX". Note that some indexes are created implicitly like table foreign keys.
type Op ¶
type Op int
Op is a predicate for the where clause.
const ( EQ Op = iota // = NEQ // <> GT // > GTE // >= LT // < LTE // <= IsNil // IS NULL / has NotNil // IS NOT NULL / hasNot In // within NotIn // without EqualFold // equals case-insensitive Contains // containing ContainsFold // containing case-insensitive HasPrefix // startingWith HasSuffix // endingWith )
List of all builtin predicates.
type Rel ¶
type Rel int
Rel is a relation type of an edge.
type Relation ¶
type Relation struct { // Type holds the relation type of the edge. Type Rel // Table holds the relation table for this edge. // For O2O and O2M, it's the table name of the type we're this edge point to. // For M2O, this is the owner's type, and for M2M this is the join table. Table string // Columns holds the relation column in the relation table above. // In O2M, M2O and O2O, this the first element. Columns []string }
Relation holds the relational database information for edges.
type SchemaMode ¶
type SchemaMode uint
A SchemaMode defines what type of schema feature a storage driver support.
const ( // Unique defines field and edge uniqueness support. Unique SchemaMode = 1 << iota // Indexes defines indexes support. Indexes // Cascade defines cascading operations (e.g. cascade deletion). Cascade // Migrate defines static schema and migration support (e.g. SQL-based). Migrate )
func (SchemaMode) Support ¶
func (m SchemaMode) Support(mode SchemaMode) bool
Support reports whether m support the given mode.
type Storage ¶
type Storage struct { Name string // storage name. Builder reflect.Type // query builder type. Dialects []string // supported dialects. IdentName string // identifier name (fields and funcs). Imports []string // import packages needed. SchemaMode SchemaMode // schema mode support. Ops func(*Field) []Op // storage specific operations. OpCode func(Op) string // operation code for predicates. }
Storage driver type for codegen.
func NewStorage ¶
NewStorage returns a the storage driver type from the given string. It fails if the provided string is not a valid option. this function is here in order to remove the validation logic from entc command line.
type Type ¶
type Type struct { *Config // Name holds the type/ent name. Name string // ID holds the ID field of this type. ID *Field // Fields holds all the primitive fields of this type. Fields []*Field // Edge holds all the edges of this type. Edges []*Edge // Indexes are the configured indexes for this type. Indexes []*Index // ForeignKeys are the foreign-keys that resides in the type table. ForeignKeys []*ForeignKey // contains filtered or unexported fields }
Type represents one node-type in the graph, its relations and the information it holds.
func (*Type) AddIndex ¶
AddIndex adds a new index for the type. It fails if the schema index is invalid.
func (Type) CreateBulkName ¶
CreateBulk returns the struct name denoting the create-bulk-builder for this type.
func (Type) CreateName ¶
CreateName returns the struct name denoting the create-builder for this type.
func (Type) DeleteName ¶
DeleteName returns the struct name denoting the delete-builder for this type.
func (Type) DeleteOneName ¶
DeleteOneName returns the struct name denoting the delete-one-builder for this type.
func (Type) EnumFields ¶
EnumFields returns the types's enum fields.
func (Type) HasAssoc ¶
HasAssoc returns true if this type has an assoc edge with the given name. faster than map access for most cases.
func (Type) HasDefault ¶
HasDefault reports if any of this type's fields has default value on creation.
func (Type) HasNumeric ¶
HasNumeric reports if this type has a numeric field.
func (Type) HasOptional ¶
HasOptional reports if this type has an optional field.
func (Type) HasUpdateDefault ¶
HasUpdateDefault reports if any of this type's fields has default value on update.
func (Type) HasValidators ¶
HasValidators reports if any of the type's field has validators.
func (Type) HookPositions ¶
HookPositions returns the position information of hooks declared in the type schema.
func (Type) MixedInFields ¶
MixedInFields returns the indices of mixin holds runtime code.
func (Type) MixedInHooks ¶
MixedInHooks returns the indices of mixin with hooks.
func (Type) MutableFields ¶
MutableFields returns the types's mutable fields.
func (Type) MutationName ¶
MutationName returns the struct name of the mutation builder for this type.
func (Type) NumConstraint ¶
NumConstraint returns the type's constraint count. Used for slice allocation.
func (Type) Receiver ¶
Receiver returns the receiver name of this node. It makes sure the receiver names doesn't conflict with import names.
func (Type) RelatedTypes ¶
RelatedTypes returns all the types (nodes) that are related (with edges) to this type.
func (Type) RuntimeMixin ¶
RuntimeMixin returns schema mixin that needs to be loaded at runtime. For example, for default values, validators or hooks.
func (Type) SiblingImports ¶
SiblingImports returns all sibling packages that are needed for the different builders.
func (Type) UpdateName ¶
UpdateName returns the struct name denoting the update-builder for this type.
func (Type) UpdateOneName ¶
UpdateOneName returns the struct name denoting the update-one-builder for this type.
type TypeTemplate ¶
type TypeTemplate struct { Name string // template name. Format func(*Type) string // file name format. ExtendPattern string // extend pattern. }
TypeTemplate specifies a template that is executed with each Type object of the graph.
func (TypeTemplate) Match ¶
func (t TypeTemplate) Match(name string) bool
Match reports if the given name matches the extended pattern.