mirror of
https://github.com/ent/ent.git
synced 2026-05-24 09:31:56 +03:00
Reviewed By: alexsn Differential Revision: D16763332 fbshipit-source-id: e3e4279c62992de192464c3d3b1036c45687507c
148 lines
3.8 KiB
Go
148 lines
3.8 KiB
Go
package edge
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
"fbc/ent/schema/field"
|
|
)
|
|
|
|
// Edge represents an edge in the graph.
|
|
type Edge struct {
|
|
typ string
|
|
tag string
|
|
ref string
|
|
name string
|
|
unique bool
|
|
required bool
|
|
inverse bool
|
|
parent *Edge
|
|
fields []*field.Field
|
|
}
|
|
|
|
// To defines an association edge between two vertices.
|
|
func To(name string, t interface{}) *assocBuilder {
|
|
return &assocBuilder{&Edge{name: name, typ: typ(t)}}
|
|
}
|
|
|
|
// From represents a reversed-edge between two vertices that has a back-reference to its source edge.
|
|
func From(name string, t interface{}) *inverseBuilder {
|
|
return &inverseBuilder{&Edge{name: name, typ: typ(t), inverse: true}}
|
|
}
|
|
|
|
// Type returns the type of the edge.
|
|
func (e Edge) Type() string { return e.typ }
|
|
|
|
// IsUnique returns is the edge is unique.
|
|
func (e Edge) IsUnique() bool { return e.unique }
|
|
|
|
// AssocName returns the edge name.
|
|
func (e Edge) Name() string { return e.name }
|
|
|
|
// IsInverse returns is the edge is inverse type.
|
|
func (e Edge) IsInverse() bool { return e.inverse }
|
|
|
|
// Assoc returns the assoc edge of the inverse edge.
|
|
func (e Edge) Assoc() *Edge { return e.parent }
|
|
|
|
// RefName returns the reference edge name.
|
|
func (e Edge) RefName() string { return e.ref }
|
|
|
|
// GetFields returns the edge fields.
|
|
func (e Edge) GetFields() []*field.Field { return e.fields }
|
|
|
|
// Tag returns the struct tag of the edge.
|
|
func (e Edge) Tag() string { return e.tag }
|
|
|
|
// IsRequired returns is this edge is an optional edge.
|
|
func (e Edge) IsRequired() bool { return e.required }
|
|
|
|
func typ(t interface{}) string {
|
|
if rt := reflect.TypeOf(t); rt.NumIn() > 0 {
|
|
return rt.In(0).Name()
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// assocBuilder is the builder for assoc edges.
|
|
type assocBuilder struct {
|
|
*Edge
|
|
}
|
|
|
|
// Fields sets the fields of the edge.
|
|
func (b *assocBuilder) Fields(f ...*field.Field) *assocBuilder {
|
|
b.fields = f
|
|
return b
|
|
}
|
|
|
|
// Unique sets the edge type to be unique. Basically, it's limited the ent to be one of the two:
|
|
// one2one or one2many. one2one applied if the inverse-edge is also unique.
|
|
func (b *assocBuilder) Unique() *assocBuilder {
|
|
b.unique = true
|
|
return b
|
|
}
|
|
|
|
// Required indicates that this edge is a required field on creation.
|
|
// Unlike fields, edges are optional by default.
|
|
func (b *assocBuilder) Required() *assocBuilder {
|
|
b.required = true
|
|
return b
|
|
}
|
|
|
|
// StructTag sets the struct tag of the assoc edge.
|
|
func (b *assocBuilder) StructTag(s string) *assocBuilder {
|
|
b.tag = s
|
|
return b
|
|
}
|
|
|
|
// Assoc creates an inverse-edge with the same type.
|
|
func (b *assocBuilder) From(name string) *inverseBuilder {
|
|
return &inverseBuilder{&Edge{name: name, typ: b.typ, inverse: true, parent: b.Edge}}
|
|
}
|
|
|
|
// Comment used to put annotations on the schema.
|
|
func (b *assocBuilder) Comment(string) *assocBuilder {
|
|
return b
|
|
}
|
|
|
|
// assocBuilder is the builder for inverse edges.
|
|
type inverseBuilder struct {
|
|
*Edge
|
|
}
|
|
|
|
// Ref sets the referenced-edge of this inverse edge.
|
|
func (b *inverseBuilder) Ref(ref string) *inverseBuilder {
|
|
b.ref = ref
|
|
return b
|
|
}
|
|
|
|
// Fields sets the fields of the edge.
|
|
func (b *inverseBuilder) Fields(f ...*field.Field) *inverseBuilder {
|
|
b.fields = f
|
|
return b
|
|
}
|
|
|
|
// Unique sets the edge type to be unique. Basically, it's limited the ent to be one of the two:
|
|
// one2one or one2many. one2one applied if the inverse-edge is also unique.
|
|
func (b *inverseBuilder) Unique() *inverseBuilder {
|
|
b.unique = true
|
|
return b
|
|
}
|
|
|
|
// Required indicates that this edge is a required field on creation.
|
|
// Unlike fields, edges are optional by default.
|
|
func (b *inverseBuilder) Required() *inverseBuilder {
|
|
b.required = true
|
|
return b
|
|
}
|
|
|
|
// StructTag sets the struct tag of the inverse edge.
|
|
func (b *inverseBuilder) StructTag(s string) *inverseBuilder {
|
|
b.tag = s
|
|
return b
|
|
}
|
|
|
|
// Comment used to put annotations on the schema.
|
|
func (b *inverseBuilder) Comment(string) *inverseBuilder {
|
|
return b
|
|
}
|