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>
This commit is contained in:
2026-05-18 01:59:51 +09:00
parent 3e236333a7
commit 0360e779f3
4 changed files with 267 additions and 15 deletions

View File

@@ -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)
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
}
}
farg.K = names[0]
if err := storeE(&farg.V, arg.V[0]); err != nil {
panic(err)
}
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
}