aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/rosa/azalea
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-05-18 01:59:51 +0900
committerOphestra <cat@gensokyo.uk>2026-05-18 02:56:38 +0900
commit0360e779f3fb9dc770e1f33420ca5b8f8f638666 (patch)
treee9278ec16068938633b04404d1169e89b9572778 /internal/rosa/azalea
parent3e236333a77233cfcd96b6fc93be91e14ab7c680 (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.go32
-rw-r--r--internal/rosa/azalea/evaluate_test.go12
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"),