// SPDX-FileCopyrightText: 2025 Romain Maneschi // // SPDX-License-Identifier: EUPL-1.2 package plugin import ( "context" "encoding/json" "fmt" "github.com/samber/oops" "github.com/tetratelabs/wazero/api" pluginLib "gitroot.dev/libs/golang/plugin/model" "gitroot.dev/server/logger" ) func (r *runtime) conf(ctx context.Context, plugin Plugin) (*pluginLib.ConfPlugin, error) { r.repo = nil r.plugin = plugin r.command = nil timerStop := r.logger.Time(fmt.Sprintf("Timer %s", plugin.Name)) defer timerStop() r.logger.Debug("start plugin conf", logger.NewLoggerPair("name", plugin.Name)) m, err := r.loadModule(ctx, plugin, nil) //no fs for conf if err != nil { r.logger.Error("loadModule for conf error", err, logger.NewLoggerPair("name", plugin.Name)) return nil, err } defer r.garbage() conf, err := r.callPluginForConf(ctx, m, r.logger.NewSubLogger(plugin.Name)) if err != nil { r.logger.Error("finish plugin conf with error", err, logger.NewLoggerPair("name", plugin.Name)) } r.logger.Debug("finish plugin conf", logger.NewLoggerPair("name", plugin.Name)) return conf, err } func (r *runtime) callPluginForConf(ctx context.Context, module api.Module, log *logger.Logger) (*pluginLib.ConfPlugin, error) { defaultConf := &pluginLib.ConfPlugin{} if pluginConf := module.ExportedFunction("pluginConf"); pluginConf != nil { ptrSizeArr, err := pluginConf.Call(ctx) if err != nil { return nil, oops.Wrapf(err, "pluginConf call") } pluginConfPtr := uint32(ptrSizeArr[0] >> 32) pluginConfSize := uint32(ptrSizeArr[0]) if pluginConfPtr != 0 { defer func() { r.free(module, []ptrSize{{ptr: uint64(pluginConfPtr), size: uint64(pluginConfSize)}}) }() } res, err := r.readString(module, "read memory conf", pluginConfPtr, pluginConfSize) if err != nil { return nil, oops.Wrapf(err, "can't read memory") } if res != "" { if err = json.Unmarshal([]byte(res), &defaultConf); err != nil { conf, err := r.readASString(module, "read conf", uint32(ptrSizeArr[0])) if err != nil { return nil, oops.Wrapf(err, "can't readASString Configuration") } if err = json.Unmarshal([]byte(conf), &defaultConf); err != nil { return nil, oops.Wrapf(err, "can't unmarshal Configuration") } } } } else { log.Info("plugin has no pluginConf exported function") } for name := range module.ExportedFunctionDefinitions() { log.Info(fmt.Sprintf("plugin has %s function", name)) } return defaultConf, nil }