File: cuecontext.go

package info (click to toggle)
golang-github-cue-lang-cue 0.14.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 19,644 kB
  • sloc: makefile: 20; sh: 15
file content (110 lines) | stat: -rw-r--r-- 3,764 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// Copyright 2021 CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package cuecontext

import (
	"fmt"

	"cuelang.org/go/cue"
	"cuelang.org/go/cue/interpreter/embed"
	"cuelang.org/go/internal"
	"cuelang.org/go/internal/core/runtime"
	"cuelang.org/go/internal/cuedebug"
	"cuelang.org/go/internal/envflag"

	_ "cuelang.org/go/pkg"
)

// Option controls a build context.
type Option struct {
	apply func(r *runtime.Runtime)
}

// New creates a new [*cue.Context].
//
// The environment variables CUE_EXPERIMENT and CUE_DEBUG are followed to configure
// the evaluator, just like the cue tool documents via [cue help environment].
// You can override these settings via options like [EvaluatorVersion] and [CUE_DEBUG].
//
// [cue help environment]: https://cuelang.org/docs/reference/command/cue-help-environment/
func New(options ...Option) *cue.Context {
	r := runtime.New()
	// Embedding is always available.
	r.SetInterpreter(embed.New())
	for _, o := range options {
		o.apply(r)
	}
	return (*cue.Context)(r)
}

// An ExternInterpreter creates a compiler that can produce implementations of
// functions written in a language other than CUE. It is currently for internal
// use only.
type ExternInterpreter = runtime.Interpreter

// Interpreter associates an interpreter for external code with this context.
func Interpreter(i ExternInterpreter) Option {
	return Option{func(r *runtime.Runtime) {
		r.SetInterpreter(i)
	}}
}

type EvalVersion = internal.EvaluatorVersion

const (
	// EvalDefault is the default version of the evaluator, which is selected based on
	// the CUE_EXPERIMENT environment variable described in [cue help environment].
	//
	// [cue help environment]: https://cuelang.org/docs/reference/command/cue-help-environment/
	EvalDefault EvalVersion = internal.DefaultVersion

	// EvalDefault is the latest stable version of the evaluator, currently [EvalV3].
	EvalStable EvalVersion = internal.StableVersion

	// EvalExperiment refers to the latest in-development version of the evaluator,
	// currently [EvalV3]. Note that this version may change without notice.
	EvalExperiment EvalVersion = internal.DevVersion

	// EvalV2 is the previous version of the evaluator. It was introduced in CUE
	// version 0.3 and is being maintained until 2024.
	EvalV2 EvalVersion = internal.EvalV2

	// EvalV3 is the current version of the evaluator. It was introduced in 2024
	// and brought a new disjunction algorithm, a new closedness algorithm, a
	// new core scheduler, and adds performance enhancements like structure sharing.
	EvalV3 EvalVersion = internal.EvalV3
)

// EvaluatorVersion indicates which version of the evaluator to use. Currently
// only experimental versions can be selected as an alternative.
func EvaluatorVersion(v EvalVersion) Option {
	return Option{func(r *runtime.Runtime) {
		r.SetVersion(v)
	}}
}

// CUE_DEBUG takes a string with the same contents as CUE_DEBUG and configures
// the context with the relevant debug options. It panics for unknown or
// malformed options.
func CUE_DEBUG(s string) Option {
	var c cuedebug.Config
	if err := envflag.Parse(&c, s); err != nil {
		panic(fmt.Errorf("cuecontext.CUE_DEBUG: %v", err))
	}

	return Option{func(r *runtime.Runtime) {
		r.SetDebugOptions(&c)
	}}
}