github.com/stackb/rules_proto@v0.0.0-20240221195024-5428336c51f1/pkg/rule/rules_closure/grpc_closure_js_library.go (about)

     1  package rules_closure
     2  
     3  import (
     4  	"github.com/bazelbuild/bazel-gazelle/config"
     5  	"github.com/bazelbuild/bazel-gazelle/label"
     6  	"github.com/bazelbuild/bazel-gazelle/resolve"
     7  	"github.com/bazelbuild/bazel-gazelle/rule"
     8  
     9  	"github.com/stackb/rules_proto/pkg/protoc"
    10  )
    11  
    12  const (
    13  	GrpcClosureJsLibraryRuleName   = "grpc_closure_js_library"
    14  	GrpcClosureJsLibraryRuleSuffix = "_grpc_closure_js_library"
    15  )
    16  
    17  func init() {
    18  	protoc.Rules().MustRegisterRule("stackb:rules_proto:grpc_closure_js_library", &grpcClosureJsLibrary{})
    19  }
    20  
    21  // grpcClosureJsLibrary implements LanguageRule for the
    22  // 'grpc_closure_js_library' rule.
    23  type grpcClosureJsLibrary struct{}
    24  
    25  // Name implements part of the LanguageRule interface.
    26  func (s *grpcClosureJsLibrary) Name() string {
    27  	return GrpcClosureJsLibraryRuleName
    28  }
    29  
    30  // KindInfo implements part of the LanguageRule interface.
    31  func (s *grpcClosureJsLibrary) KindInfo() rule.KindInfo {
    32  	return closureJsLibraryKindInfo
    33  }
    34  
    35  // LoadInfo implements part of the LanguageRule interface.
    36  func (s *grpcClosureJsLibrary) LoadInfo() rule.LoadInfo {
    37  	return rule.LoadInfo{
    38  		Name:    "@build_stack_rules_proto//rules/closure:grpc_closure_js_library.bzl",
    39  		Symbols: []string{GrpcClosureJsLibraryRuleName},
    40  	}
    41  }
    42  
    43  // ProvideRule implements part of the LanguageRule interface.
    44  func (s *grpcClosureJsLibrary) ProvideRule(cfg *protoc.LanguageRuleConfig, pc *protoc.ProtocConfiguration) protoc.RuleProvider {
    45  	outputs := pc.GetPluginOutputs("stackb:grpc.js:protoc-gen-grpc-js")
    46  	if len(outputs) == 0 {
    47  		return nil
    48  	}
    49  
    50  	return &ClosureJsLibrary{
    51  		KindName:       GrpcClosureJsLibraryRuleName,
    52  		RuleNameSuffix: GrpcClosureJsLibraryRuleSuffix,
    53  		Outputs:        outputs,
    54  		RuleConfig:     cfg,
    55  		Config:         pc,
    56  		Resolver: func(c *config.Config, ix *resolve.RuleIndex, r *rule.Rule, imports []string, from label.Label) {
    57  			protoDep := ":" + pc.Library.BaseName() + ProtoClosureJsLibraryRuleSuffix
    58  
    59  			deps := append(r.AttrStrings("deps"), protoDep)
    60  
    61  			if len(deps) > 0 {
    62  				r.SetAttr("deps", deps)
    63  				r.SetAttr("exports", deps)
    64  			}
    65  		},
    66  	}
    67  }