GitRoot

craft your forge, build your project, grow your community freely
 1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
 2//
 3// SPDX-License-Identifier: EUPL-1.2
 4
 5package plugin
 6
 7import (
 8	"context"
 9	"encoding/json"
10
11	"github.com/samber/oops"
12	"github.com/tetratelabs/wazero/api"
13	pluginLib "gitroot.dev/libs/golang/plugin"
14	"gitroot.dev/server/logger"
15)
16
17func callPluginForConf(ctx context.Context, module api.Module, log *logger.Logger) ([]pluginLib.PluginRun, error) {
18	defaultConf := []pluginLib.PluginRun{}
19
20	free := module.ExportedFunction("free")
21	if defaultRun := module.ExportedFunction("defaultRun"); defaultRun != nil {
22		ptrSize, err := defaultRun.Call(ctx)
23		if err != nil {
24			return nil, oops.Wrapf(err, "defaultRun call")
25		}
26		defaultRunPtr := uint32(ptrSize[0] >> 32)
27		defaultRunSize := uint32(ptrSize[0])
28		if defaultRunPtr != 0 {
29			defer func() {
30				_, err := free.Call(ctx, uint64(defaultRunPtr))
31				if err != nil {
32					log.Error("can't free defaultRun", err)
33				}
34			}()
35		}
36		res, ok := module.Memory().Read(defaultRunPtr, defaultRunSize)
37		if !ok {
38			return nil, oops.Errorf("can't read memory")
39		}
40		log.Debug("Conf receive from guest", logger.NewLoggerPair("json", string(res)))
41		if err = json.Unmarshal(res, &defaultConf); err != nil {
42			log.Error("can't read Configuration", err)
43		}
44	}
45	return defaultConf, nil
46}