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}