func buildPackages(pc *ProtoConfig, dir, rel string, protoFiles, genFiles []string) []*Package {
	packageMap := make(map[string]*Package)
	for _, name := range protoFiles {
		info := protoFileInfo(dir, name)
		key := info.PackageName
		if pc.groupOption != "" {
			for _, opt := range info.Options {
				if opt.Key == pc.groupOption {
					key = opt.Value
					break
				}
			}
		}
		if packageMap[key] == nil {
			packageMap[key] = newPackage(info.PackageName)
		}
		packageMap[key].addFile(info)
	}

	switch pc.Mode {
	case DefaultMode:
		pkg, err := selectPackage(dir, rel, packageMap)
		if err != nil {
			log.Print(err)
		}
		if pkg == nil {
			return nil // empty rule created in generateEmpty
		}
		for _, name := range genFiles {
			pkg.addGenFile(dir, name)
		}
		return []*Package{pkg}

	case PackageMode:
		pkgs := make([]*Package, 0, len(packageMap))
		for _, pkg := range packageMap {
			pkgs = append(pkgs, pkg)
		}
		return pkgs

	default:
		return nil
	}
}
func buildPackages(pc *ProtoConfig, dir, rel string, protoFiles, genFiles []string) []*Package {
	packageMap := make(map[string]*Package)
	for _, name := range protoFiles {
		info := protoFileInfo(dir, name)
		key := info.PackageName
		if pc.groupOption != "" {
			for _, opt := range info.Options {
				if opt.Key == pc.groupOption {
					key = opt.Value
					break
				}
			}
		}
		if packageMap[key] == nil {
			packageMap[key] = newPackage(info.PackageName)
		}
		packageMap[key].addFile(info)
	}

	switch pc.Mode {
	case DefaultMode:
		pkg, err := selectPackage(dir, rel, packageMap)
		if err != nil {
			log.Print(err)
		}
		if pkg == nil {
			return nil 
		}
		for _, name := range genFiles {
			pkg.addGenFile(dir, name)
		}
		return []*Package{pkg}

	case PackageMode:
		pkgs := make([]*Package, 0, len(packageMap))
		for _, pkg := range packageMap {
			pkgs = append(pkgs, pkg)
		}
		return pkgs

	default:
		return nil
	}
}
func buildPackages ( pc * ProtoConfig , dir , rel string , protoFiles , genFiles [ ] string ) [ ] * Package { packageMap := make ( map [ string ] * Package ) for _ , name := range protoFiles { info := protoFileInfo ( dir , name ) key := info . PackageName if pc . groupOption != " " { for _ , opt := range info . Options { if opt . Key == pc . groupOption { key = opt . Value break } } } if packageMap [ key ] == nil { packageMap [ key ] = newPackage ( info . PackageName ) } packageMap [ key ] . addFile ( info ) } switch pc . Mode { case DefaultMode : pkg , err := selectPackage ( dir , rel , packageMap ) if err != nil { log . Print ( err ) } if pkg == nil { return nil // empty rule created in generateEmpty } for _ , name := range genFiles { pkg . addGenFile ( dir , name ) } return [ ] * Package { pkg } case PackageMode : pkgs := make ( [ ] * Package , 0 , len ( packageMap ) ) for _ , pkg := range packageMap { pkgs = append ( pkgs , pkg ) } return pkgs default : return nil } }
// buildPackage extracts metadata from the .proto files in a directory and
// constructs possibly several packages, then selects a package to generate
// a proto_library rule for.
buildPackage extracts metadata from the . proto files in a directory and constructs possibly several packages then selects a package to generate a proto_library rule for .