Search Apps Documentation Source Content File Folder Download Copy Actions Download

migrate.gno

1.19 Kb · 41 lines
 1package basedao
 2
 3import (
 4	"errors"
 5
 6	"gno.land/p/samcrew/daokit"
 7)
 8
 9// Making this action name extra explicit.
10const ActionChangeDAOImplementationKind = "gno.land/p/samcrew/basedao.ChangeDAOImplementation"
11
12type MigrateFn = func(prev *DAOPrivate, params []any, rlm realm) daokit.DAO
13
14type MigrationParamsFn = func() []any
15
16type actionChangeDAOImplementation struct {
17	migrate MigrateFn
18}
19
20func (a *actionChangeDAOImplementation) String() string {
21	return "WARNING: thoroughly check the migration code before approving this"
22}
23
24func NewChangeDAOImplementationHandler(dao *DAOPrivate, setImplem daokit.SetImplemFn, paramsFn MigrationParamsFn) daokit.ActionHandler {
25	if dao == nil || setImplem == nil || paramsFn == nil {
26		panic("nil arg")
27	}
28	return daokit.NewActionHandler(ActionChangeDAOImplementationKind, func(i interface{}, rlm realm) {
29		action, ok := i.(*actionChangeDAOImplementation)
30		if !ok {
31			panic(errors.New("invalid action type"))
32		}
33
34		migrated := action.migrate(dao, paramsFn(), rlm)
35		setImplem(migrated)
36	})
37}
38
39func NewChangeDAOImplementationAction(migrate MigrateFn) daokit.Action {
40	return daokit.NewAction(ActionChangeDAOImplementationKind, &actionChangeDAOImplementation{migrate: migrate})
41}