params.gno

// Package params provides functions for creating parameter executors that
// interface with the Params Keeper.
//
// This package enables setting various parameter types (such as strings,
// integers, booleans, and byte slices) through the GovDAO proposal mechanism.
// Each function returns an executor that, when called, sets the specified
// parameter in the Params Keeper.
//
// The executors are designed to be used within governance proposals to modify
// parameters dynamically. The integration with the GovDAO allows for parameter
// changes to be proposed and executed in a controlled manner, ensuring that
// modifications are subject to governance processes.
//
// Example usage:
//
//	// This executor can be used in a governance proposal to set the parameter.
//	pr := params.NewSysParamStringPropExecutor("bank", "p", "restricted_denoms")
package params

import (
	"chain"
	prms "sys/params"

	"gno.land/r/gov/dao"
)

// this is only used for emitting events.
func syskey(module, submodule, name string) string {
	return module + ":" + submodule + ":" + name
}

func NewSysParamStringPropRequest(module, submodule, name, value string) dao.ProposalRequest {
	return newPropRequest(
		syskey(module, submodule, name),
		func() { prms.SetSysParamString(module, submodule, name, value) },
		"",
	)
}

func NewSysParamInt64PropRequest(module, submodule, name string, value int64) dao.ProposalRequest {
	return newPropRequest(
		syskey(module, submodule, name),
		func() { prms.SetSysParamInt64(module, submodule, name, value) },
		"",
	)
}

func NewSysParamUint64PropRequest(module, submodule, name string, value uint64) dao.ProposalRequest {
	return newPropRequest(
		syskey(module, submodule, name),
		func() { prms.SetSysParamUint64(module, submodule, name, value) },
		"",
	)
}

func NewSysParamBoolPropRequest(module, submodule, name string, value bool) dao.ProposalRequest {
	return newPropRequest(
		syskey(module, submodule, name),
		func() { prms.SetSysParamBool(module, submodule, name, value) },
		"",
	)
}

func NewSysParamBytesPropRequest(module, submodule, name string, value []byte) dao.ProposalRequest {
	return newPropRequest(
		syskey(module, submodule, name),
		func() { prms.SetSysParamBytes(module, submodule, name, value) },
		"",
	)
}

func NewSysParamStringsPropRequest(module, submodule, name string, value []string) dao.ProposalRequest {
	return newPropRequest(
		syskey(module, submodule, name),
		func() { prms.SetSysParamStrings(module, submodule, name, value) },
		"",
	)
}

func NewSysParamStringsPropRequestWithTitle(module, submodule, name, title string, value []string) dao.ProposalRequest {
	return newPropRequest(
		syskey(module, submodule, name),
		func() { prms.SetSysParamStrings(module, submodule, name, value) },
		title,
	)
}
func NewSysParamStringsPropRequestAddWithTitle(module, submodule, name, title string, value []string) dao.ProposalRequest {
	return newPropRequest(
		syskey(module, submodule, name),
		func() { prms.UpdateSysParamStrings(module, submodule, name, value, true) },
		title,
	)
}
func NewSysParamStringsPropRequestRemoveWithTitle(module, submodule, name, title string, value []string) dao.ProposalRequest {
	return newPropRequest(
		syskey(module, submodule, name),
		func() { prms.UpdateSysParamStrings(module, submodule, name, value, false) },
		title,
	)
}
func newPropRequest(key string, fn func(), title string) dao.ProposalRequest {
	callback := func(cur realm) error {
		fn()
		chain.Emit("set", "key", key) // TODO document, make const, make consistent. 'k'??
		return nil
	}

	if title == "" {
		title = "Set new sys/params key"
	}

	e := dao.NewSimpleExecutor(callback, "")

	return dao.NewProposalRequest(title, "This proposal wants to add a new key to sys/params: "+key, e)
}