Files
ent/edge/edge.go
Ariel Mashraki 2c8b5a65b7 entc: abandon plugins
Summary:
Go plugin is not a good solution for both internal and external usage.
It's hard to manage and maintain matching versions (both Go and external libraries), and it does not support Windows.

Reviewed By: alexsn

Differential Revision: D16582217

fbshipit-source-id: 81876d2c6f30bbfc16ecf9e5000f0670f2e62484
2019-08-01 05:07:48 -07:00

148 lines
3.8 KiB
Go

package edge
import (
"reflect"
"fbc/ent/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
}