func main()

in codegen/runner/runner.go [58:241]


func main() {
	configFile := flag.String("config", "", "the config file path")
	moduleName := flag.String("instance", "", "")
	moduleClass := flag.String("type", "", "")
	selectiveModule := flag.Bool("selective", false, "")
	flag.Parse()

	if *configFile == "" {
		flag.Usage()
		os.Exit(1)
		return
	}

	configRoot := filepath.Dir(*configFile)
	config := zanzibar.NewStaticConfigOrDie([]*zanzibar.ConfigOption{
		zanzibar.ConfigFilePath(*configFile),
	}, nil)

	configRoot, err := filepath.Abs(configRoot)
	checkError(
		err, fmt.Sprintf("can not get abs path of config dir %s", configRoot),
	)

	copyright := []byte("")
	if config.ContainsKey("copyrightHeader") {
		bytes, err := ioutil.ReadFile(filepath.Join(
			configRoot,
			config.MustGetString("copyrightHeader"),
		))
		if err == nil {
			copyright = bytes
		}
	}

	stagingReqHeader := "X-Zanzibar-Use-Staging"
	if config.ContainsKey("stagingReqHeader") {
		stagingReqHeader = config.MustGetString("stagingReqHeader")
	}

	deputyReqHeader := "x-deputy-forwarded"
	if config.ContainsKey("deputyReqHeader") {
		deputyReqHeader = config.MustGetString("deputyReqHeader")
	}

	relMiddlewareConfigDir := ""
	if config.ContainsKey("middlewareConfig") {
		relMiddlewareConfigDir = config.MustGetString("middlewareConfig")
	}

	relDefaultMiddlewareConfigDir := ""
	if config.ContainsKey("defaultMiddlewareConfig") {
		relDefaultMiddlewareConfigDir = config.MustGetString("defaultMiddlewareConfig")
	}

	searchPaths := make(map[string][]string, 0)
	config.MustGetStruct("moduleSearchPaths", &searchPaths)

	defaultDependencies := make(map[string][]string, 0)
	if config.ContainsKey("defaultDependencies") {
		config.MustGetStruct("defaultDependencies", &defaultDependencies)
	}

	defaultHeaders := make([]string, 0)
	if config.ContainsKey("defaultHeaders") {
		config.MustGetStruct("defaultHeaders", &defaultHeaders)
	}

	moduleIdlSubDir := map[string]string{}
	config.MustGetStruct("moduleIdlSubDir", &moduleIdlSubDir)
	genCodePackage := map[string]string{}
	config.MustGetStruct("genCodePackage", &genCodePackage)
	options := &codegen.PackageHelperOptions{
		RelIdlRootDir:                 config.MustGetString("idlRootDir"),
		ModuleIdlSubDir:               moduleIdlSubDir,
		RelTargetGenDir:               config.MustGetString("targetGenDir"),
		RelMiddlewareConfigDir:        relMiddlewareConfigDir,
		RelDefaultMiddlewareConfigDir: relDefaultMiddlewareConfigDir,
		AnnotationPrefix:              config.MustGetString("annotationPrefix"),
		GenCodePackage:                genCodePackage,
		CopyrightHeader:               string(copyright),
		StagingReqHeader:              stagingReqHeader,
		DeputyReqHeader:               deputyReqHeader,
		TraceKey:                      config.MustGetString("traceKey"),
		ModuleSearchPaths:             searchPaths,
		DefaultDependencies:           defaultDependencies,
		DefaultHeaders:                defaultHeaders,
	}

	options.QPSLevelsEnabled = true
	if config.ContainsKey("qpsLevelsEnabled") {
		options.QPSLevelsEnabled = config.MustGetBoolean("qpsLevelsEnabled")
	}

	options.CustomInitialisationEnabled = false
	if config.ContainsKey("customInitialisationEnabled") {
		options.CustomInitialisationEnabled = config.MustGetBoolean("customInitialisationEnabled")
	}

	packageHelper, err := codegen.NewPackageHelper(
		config.MustGetString("packageRoot"),
		configRoot,
		options,
	)
	checkError(
		err, fmt.Sprintf("Can't build package helper %s", configRoot),
	)

	genMock := config.ContainsKey("genMock")
	if genMock {
		genMock = config.MustGetBoolean("genMock")
	}
	var moduleSystem *codegen.ModuleSystem
	if genMock {
		parallelizeFactor := _defaultParallelizeFactor
		if config.ContainsKey("parallelizeFactor") {
			parallelizeFactor = int(config.MustGetInt("parallelizeFactor"))
		}
		moduleSystem, err = codegen.NewDefaultModuleSystemWithMockHook(packageHelper, true,
			true, true, "test.yaml", parallelizeFactor, true)
	} else {
		moduleSystem, err = codegen.NewDefaultModuleSystem(packageHelper, true)
	}
	checkError(
		err, fmt.Sprintf("Error creating module system %s", configRoot),
	)

	fmt.Printf("Generating module system components:\n")

	if *moduleClass != "" && *moduleName != "" {
		resolvedModules, err := moduleSystem.ResolveModules(
			packageHelper.PackageRoot(),
			configRoot,
			packageHelper.CodeGenTargetPath(),
			codegen.Options{
				EnableCustomInitialisation: options.CustomInitialisationEnabled,
			},
		)
		checkError(err, "error resolving modules")

		for _, instance := range resolvedModules[*moduleClass] {
			if instance.InstanceName == *moduleName {
				physicalGenDir := filepath.Join(packageHelper.CodeGenTargetPath(), instance.Directory)
				err := moduleSystem.Build(
					packageHelper.PackageRoot(),
					configRoot,
					physicalGenDir,
					instance,
					codegen.Options{
						CommitChange: true,
					},
				)
				checkError(err, "error generating code")
			}
		}
	} else {
		customTemplates, _ := codegen.NewDefaultTemplate()
		resolvedModules, err := moduleSystem.ResolveModules(
			packageHelper.PackageRoot(),
			configRoot,
			packageHelper.CodeGenTargetPath(),
			codegen.Options{
				EnableCustomInitialisation: options.CustomInitialisationEnabled,
				CustomTemplates:            customTemplates,
			},
		)
		checkError(err, "error resolving modules")
		var dependencies []codegen.ModuleDependency
		if *selectiveModule {
			dependencies = getSelectiveModule()
		}
		_, err = moduleSystem.IncrementalBuild(
			packageHelper.PackageRoot(),
			configRoot,
			packageHelper.CodeGenTargetPath(),
			dependencies,
			resolvedModules,
			codegen.Options{
				CommitChange:     true,
				QPSLevelsEnabled: options.QPSLevelsEnabled,
			},
		)
		checkError(err, "Failed to generate module system components")
	}
}