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  }