github.com/joomcode/cue@v0.4.4-0.20221111115225-539fe3512047/pkg/joom/cuetools/context.go (about)

     1  package cuetools
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  
     7  	"github.com/joomcode/cue/cue/ast"
     8  	"github.com/joomcode/cue/cue/cuecontext"
     9  	"github.com/joomcode/cue/cue/parser"
    10  	"github.com/pkg/errors"
    11  )
    12  
    13  type ConfigContext struct {
    14  	EnvType    string
    15  	Cluster    string
    16  	DevEnvName string
    17  	CueFile    string
    18  }
    19  
    20  func (cc *ConfigContext) toString() string {
    21  	return fmt.Sprintf(`
    22  #Env: "%s"
    23  #Cluster:     "%s"
    24  #DevEnvName:  "%s"
    25  `, cc.EnvType, cc.Cluster, cc.DevEnvName)
    26  }
    27  
    28  func (cc *ConfigContext) buildCueConfigContext(templatePath string) (*ast.File, error) {
    29  	incompleteContextBytes, err := os.ReadFile(templatePath)
    30  	if err != nil {
    31  		return nil, err
    32  	}
    33  
    34  	params := cc.toString()
    35  	f, parseError := parser.ParseFile(templatePath, string(incompleteContextBytes)+params)
    36  	if parseError != nil {
    37  		return nil, errors.Wrap(parseError, params)
    38  	}
    39  
    40  	// test parameters validity
    41  	if err = cuecontext.New().BuildFile(f).Validate(); err != nil {
    42  		return nil, errors.Wrap(CueErrorDetails(err), params)
    43  	}
    44  	return f, nil
    45  }
    46  
    47  func (cc *ConfigContext) contextAugmentingParser(name string, src interface{}) (*ast.File, error) {
    48  	if name == "../config/internal/context/context.cue" {
    49  		return cc.buildCueConfigContext(name)
    50  	}
    51  	return parser.ParseFile(name, src)
    52  }