github.com/ipld/go-ipld-prime@v0.21.0/schema/gen/go/genLink.go (about) 1 package gengo 2 3 import ( 4 "io" 5 6 "github.com/ipld/go-ipld-prime/schema" 7 "github.com/ipld/go-ipld-prime/schema/gen/go/mixins" 8 ) 9 10 type linkGenerator struct { 11 AdjCfg *AdjunctCfg 12 mixins.LinkTraits 13 PkgName string 14 Type *schema.TypeLink 15 } 16 17 func (linkGenerator) IsRepr() bool { return false } // hint used in some generalized templates. 18 19 // --- native content and specializations ---> 20 21 func (g linkGenerator) EmitNativeType(w io.Writer) { 22 emitNativeType_scalar(w, g.AdjCfg, g) 23 } 24 func (g linkGenerator) EmitNativeAccessors(w io.Writer) { 25 emitNativeAccessors_scalar(w, g.AdjCfg, g) 26 } 27 func (g linkGenerator) EmitNativeBuilder(w io.Writer) { 28 emitNativeBuilder_scalar(w, g.AdjCfg, g) 29 } 30 31 func (g linkGenerator) EmitNativeMaybe(w io.Writer) { 32 emitNativeMaybe(w, g.AdjCfg, g) 33 } 34 35 // --- type info ---> 36 37 func (g linkGenerator) EmitTypeConst(w io.Writer) { 38 doTemplate(` 39 // TODO EmitTypeConst 40 `, w, g.AdjCfg, g) 41 } 42 43 // --- TypedNode interface satisfaction ---> 44 45 func (g linkGenerator) EmitTypedNodeMethodType(w io.Writer) { 46 doTemplate(` 47 func ({{ .Type | TypeSymbol }}) Type() schema.Type { 48 return nil /*TODO:typelit*/ 49 } 50 `, w, g.AdjCfg, g) 51 52 // Bonus feature for some links (conforms to the schema.TypedLinkNode interface): 53 if g.Type.HasReferencedType() { 54 doTemplate(` 55 func ({{ .Type | TypeSymbol }}) LinkTargetNodePrototype() datamodel.NodePrototype { 56 return Type.{{ .Type.ReferencedType | TypeSymbol }}__Repr 57 } 58 `, w, g.AdjCfg, g) 59 } 60 } 61 62 func (g linkGenerator) EmitTypedNodeMethodRepresentation(w io.Writer) { 63 emitTypicalTypedNodeMethodRepresentation(w, g.AdjCfg, g) 64 } 65 66 // --- Node interface satisfaction ---> 67 68 func (g linkGenerator) EmitNodeType(w io.Writer) { 69 // No additional types needed. Methods all attach to the native type. 70 } 71 func (g linkGenerator) EmitNodeTypeAssertions(w io.Writer) { 72 emitNodeTypeAssertions_typical(w, g.AdjCfg, g) 73 } 74 func (g linkGenerator) EmitNodeMethodAsLink(w io.Writer) { 75 emitNodeMethodAsKind_scalar(w, g.AdjCfg, g) 76 } 77 func (g linkGenerator) EmitNodeMethodPrototype(w io.Writer) { 78 emitNodeMethodPrototype_typical(w, g.AdjCfg, g) 79 } 80 func (g linkGenerator) EmitNodePrototypeType(w io.Writer) { 81 emitNodePrototypeType_typical(w, g.AdjCfg, g) 82 } 83 84 // --- NodeBuilder and NodeAssembler ---> 85 86 func (g linkGenerator) GetNodeBuilderGenerator() NodeBuilderGenerator { 87 return linkBuilderGenerator{ 88 g.AdjCfg, 89 mixins.LinkAssemblerTraits{ 90 PkgName: g.PkgName, 91 TypeName: g.TypeName, 92 AppliedPrefix: "_" + g.AdjCfg.TypeSymbol(g.Type) + "__", 93 }, 94 g.PkgName, 95 g.Type, 96 } 97 } 98 99 type linkBuilderGenerator struct { 100 AdjCfg *AdjunctCfg 101 mixins.LinkAssemblerTraits 102 PkgName string 103 Type *schema.TypeLink 104 } 105 106 func (linkBuilderGenerator) IsRepr() bool { return false } // hint used in some generalized templates. 107 108 func (g linkBuilderGenerator) EmitNodeBuilderType(w io.Writer) { 109 emitEmitNodeBuilderType_typical(w, g.AdjCfg, g) 110 } 111 func (g linkBuilderGenerator) EmitNodeBuilderMethods(w io.Writer) { 112 emitNodeBuilderMethods_typical(w, g.AdjCfg, g) 113 } 114 func (g linkBuilderGenerator) EmitNodeAssemblerType(w io.Writer) { 115 emitNodeAssemblerType_scalar(w, g.AdjCfg, g) 116 } 117 func (g linkBuilderGenerator) EmitNodeAssemblerMethodAssignNull(w io.Writer) { 118 emitNodeAssemblerMethodAssignNull_scalar(w, g.AdjCfg, g) 119 } 120 func (g linkBuilderGenerator) EmitNodeAssemblerMethodAssignLink(w io.Writer) { 121 emitNodeAssemblerMethodAssignKind_scalar(w, g.AdjCfg, g) 122 } 123 func (g linkBuilderGenerator) EmitNodeAssemblerMethodAssignNode(w io.Writer) { 124 emitNodeAssemblerMethodAssignNode_scalar(w, g.AdjCfg, g) 125 } 126 func (g linkBuilderGenerator) EmitNodeAssemblerOtherBits(w io.Writer) { 127 // Nothing needed here for link kinds. 128 }