54 lines
1.6 KiB
Go
54 lines
1.6 KiB
Go
|
package types
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
|
||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||
|
)
|
||
|
|
||
|
// Constants pertaining to a Content object
|
||
|
const (
|
||
|
MaxDescriptionLength int = 5000
|
||
|
MaxTitleLength int = 140
|
||
|
)
|
||
|
|
||
|
// Content defines an interface that a proposal must implement. It contains
|
||
|
// information such as the title and description along with the type and routing
|
||
|
// information for the appropriate handler to process the proposal. Content can
|
||
|
// have additional fields, which will handled by a proposal's Handler.
|
||
|
type Content interface {
|
||
|
GetTitle() string
|
||
|
GetDescription() string
|
||
|
ProposalRoute() string
|
||
|
ProposalType() string
|
||
|
ValidateBasic() sdk.Error
|
||
|
String() string
|
||
|
}
|
||
|
|
||
|
// Handler defines a function that handles a proposal after it has passed the
|
||
|
// governance process.
|
||
|
type Handler func(ctx sdk.Context, content Content) sdk.Error
|
||
|
|
||
|
// ValidateAbstract validates a proposal's abstract contents returning an error
|
||
|
// if invalid.
|
||
|
func ValidateAbstract(codespace sdk.CodespaceType, c Content) sdk.Error {
|
||
|
title := c.GetTitle()
|
||
|
if len(strings.TrimSpace(title)) == 0 {
|
||
|
return ErrInvalidProposalContent(codespace, "proposal title cannot be blank")
|
||
|
}
|
||
|
if len(title) > MaxTitleLength {
|
||
|
return ErrInvalidProposalContent(codespace, fmt.Sprintf("proposal title is longer than max length of %d", MaxTitleLength))
|
||
|
}
|
||
|
|
||
|
description := c.GetDescription()
|
||
|
if len(description) == 0 {
|
||
|
return ErrInvalidProposalContent(codespace, "proposal description cannot be blank")
|
||
|
}
|
||
|
if len(description) > MaxDescriptionLength {
|
||
|
return ErrInvalidProposalContent(codespace, fmt.Sprintf("proposal description is longer than max length of %d", MaxDescriptionLength))
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|