diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-05-18 01:59:51 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-05-18 02:56:38 +0900 |
| commit | 0360e779f3fb9dc770e1f33420ca5b8f8f638666 (patch) | |
| tree | e9278ec16068938633b04404d1169e89b9572778 /internal/rosa/azalea | |
| parent | 3e236333a77233cfcd96b6fc93be91e14ab7c680 (diff) | |
internal/rosa: initial azalea bindings
Supported fields are still rather minimal, but evaluation works, and resulting artifacts cure correctly.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/rosa/azalea')
| -rw-r--r-- | internal/rosa/azalea/evaluate.go | 32 | ||||
| -rw-r--r-- | internal/rosa/azalea/evaluate_test.go | 12 |
2 files changed, 33 insertions, 11 deletions
diff --git a/internal/rosa/azalea/evaluate.go b/internal/rosa/azalea/evaluate.go index daf38849..063471e1 100644 --- a/internal/rosa/azalea/evaluate.go +++ b/internal/rosa/azalea/evaluate.go @@ -140,6 +140,8 @@ var ( // IdentInputs is a special array argument in a package declaration whose // values of [Ident] are kept as is when passed to a [PF]. IdentInputs = unique.Make(Ident("inputs")) + // IdentRuntime has the same semantics as [IdentInputs]. + IdentRuntime = unique.Make(Ident("runtime")) // ErrInvalidInputs is panicked for an [IdentInputs] argument to [PF] // sharing its value or set for R. @@ -274,6 +276,7 @@ func evaluateAny(d PF, s []Frame, expr, rp any) bool { fp.Val = maps.Clone(f.V) } + args: for _, arg := range e.Args { names := make([]unique.Handle[Ident], len(arg.K)) for i, name := range arg.K { @@ -281,16 +284,23 @@ func evaluateAny(d PF, s []Frame, expr, rp any) bool { } farg := FArg{R: arg.R} - if e.Package && slices.Contains(names, IdentInputs) { - if len(names) != 1 || len(arg.V) != 1 || arg.R { - panic(ErrInvalidInputs) - } - farg.K = names[0] - if err := storeE(&farg.V, arg.V[0]); err != nil { - panic(err) + if e.Package { + for _, special := range [...]unique.Handle[Ident]{ + IdentInputs, + IdentRuntime, + } { + if slices.Contains(names, special) { + if len(names) != 1 || len(arg.V) != 1 || arg.R { + panic(ErrInvalidInputs) + } + farg.K = names[0] + if err := storeE(&farg.V, arg.V[0]); err != nil { + panic(err) + } + fargs = append(fargs, farg) + continue args + } } - fargs = append(fargs, farg) - continue } if !evaluateAny(d, s, arg.V, &farg.V) { @@ -333,7 +343,7 @@ func evaluateAny(d PF, s []Frame, expr, rp any) bool { } // Evaluate evaluates a statement and returns its value. -func Evaluate[T Value](d PF, s []Frame, expr any) (v T, set bool, err error) { +func Evaluate[T any](d PF, s []Frame, expr any) (v T, set bool, err error) { defer func() { r := recover() if r == nil { @@ -346,6 +356,6 @@ func Evaluate[T Value](d PF, s []Frame, expr any) (v T, set bool, err error) { } err = _err }() - set = evaluate[T](d, s, expr, &v) + set = evaluateAny(d, s, expr, &v) return } diff --git a/internal/rosa/azalea/evaluate_test.go b/internal/rosa/azalea/evaluate_test.go index aa7de27e..26c4e668 100644 --- a/internal/rosa/azalea/evaluate_test.go +++ b/internal/rosa/azalea/evaluate_test.go @@ -125,6 +125,18 @@ func TestEvaluate(t *testing.T) { Err: ErrInvalidInputs, }}, + {"bound runtime", `package name { runtime* = []; }`, nil, "", EvaluationError{ + Expr: Func{ + Ident: Ident("name"), + Package: true, + + Args: []Arg{ + {K: []Ident{"runtime"}, V: Val{Array(nil)}, R: true}, + }, + }, + Err: ErrInvalidInputs, + }}, + {"concat inputs", `package name { inputs = ""+""; }`, nil, "", EvaluationError{ Expr: Func{ Ident: Ident("name"), |
