lang: Add an embedded package for embedded imports

This adds a new "embedded" package which can be used to import
system-like packages that are embedded into the binary.
This commit is contained in:
James Shubin
2024-02-22 19:02:33 -05:00
parent 9d8beb85d7
commit 70b5ed7067
7 changed files with 175 additions and 0 deletions

View File

@@ -31,6 +31,7 @@ import (
"github.com/purpleidea/mgmt/engine"
engineUtil "github.com/purpleidea/mgmt/engine/util"
"github.com/purpleidea/mgmt/lang/core"
"github.com/purpleidea/mgmt/lang/embedded"
"github.com/purpleidea/mgmt/lang/funcs"
"github.com/purpleidea/mgmt/lang/funcs/structs"
"github.com/purpleidea/mgmt/lang/inputs"
@@ -3235,6 +3236,37 @@ func (obj *StmtProg) importScope(info *interfaces.ImportData, scope *interfaces.
// obj.data.Base + obj.data.Metadata.Main
// but recursive imports mean this is not always the active file...
// attempt to load an embedded system import first (pure mcl rather than golang)
if fs, err := embedded.Lookup(info.Name); info.IsSystem && err == nil {
nextVertex, err := obj.nextVertex(info)
if err != nil {
return nil, err
}
//tree, err := util.FsTree(fs, "/")
//if err != nil {
// return nil, err
//}
//obj.data.Logf("tree:\n%s", tree)
s := "/" + interfaces.MetadataFilename // standard entry point
//s := "/" // would this directory parser approach be better?
input, err := inputs.ParseInput(s, fs) // use my FS
if err != nil {
return nil, errwrap.Wrapf(err, "embedded could not activate an input parser")
}
// The files we're pulling in are already embedded, so we must
// not try to copy them in from disk or it won't succeed.
input.Files = []string{} // clear
embeddedScope, err := obj.importScopeWithParsedInputs(input, scope, nextVertex)
if err != nil {
return nil, errwrap.Wrapf(err, "embedded import of `%s` failed", info.Name)
}
return embeddedScope, nil
}
if info.IsSystem { // system imports are the exact name, eg "fmt"
systemScope, err := obj.importSystemScope(info.Name)
if err != nil {