func getBlueprintVersion()

in cli/bpmetadata/tfconfig.go [93:137]


func getBlueprintVersion(configPath string) (*blueprintVersion, error) {
	bytes, err := os.ReadFile(configPath)
	if err != nil {
		return nil, err
	}

	//create hcl file object from the provided tf config
	fileName := filepath.Base(configPath)
	var diags hcl.Diagnostics
	p := hclparse.NewParser()
	versionsFile, fileDiags := p.ParseHCL(bytes, fileName)
	diags = append(diags, fileDiags...)
	err = hasHclErrors(diags)
	if err != nil {
		return nil, err
	}

	//parse out the blueprint version from the config
	modName, err := parseBlueprintVersion(versionsFile, diags)
	if err != nil {
		return nil, fmt.Errorf("error parsing blueprint version: %w", err)
	}

	//parse out the required version from the config
	var hclModule tfconfig.Module
	hclModule.RequiredProviders = make(map[string]*tfconfig.ProviderRequirement)
	hclModuleDiag := tfconfig.LoadModuleFromFile(versionsFile, &hclModule)
	diags = append(diags, hclModuleDiag...)
	err = hasHclErrors(diags)
	if err != nil {
		return nil, err
	}

	requiredCore := ""
	if len(hclModule.RequiredCore) != 0 {
		//always looking for the first element since tf blueprints
		//have one required core version
		requiredCore = hclModule.RequiredCore[0]
	}

	return &blueprintVersion{
		moduleVersion:     modName,
		requiredTfVersion: requiredCore,
	}, nil
}