- //nolint: goconst
- package main
-
- import (
- "errors"
- "fmt"
-
- "github.com/BurntSushi/toml"
- )
-
- // Config is the application configuration.
- type Config struct {
- ChainID string `toml:"chain_id"`
- Listen string
- Protocol string
- Dir string
- PersistInterval uint64 `toml:"persist_interval"`
- SnapshotInterval uint64 `toml:"snapshot_interval"`
- RetainBlocks uint64 `toml:"retain_blocks"`
- ValidatorUpdates map[string]map[string]uint8 `toml:"validator_update"`
- PrivValServer string `toml:"privval_server"`
- PrivValKey string `toml:"privval_key"`
- PrivValState string `toml:"privval_state"`
- Misbehaviors map[string]string `toml:"misbehaviors"`
- KeyType string `toml:"key_type"`
- }
-
- // LoadConfig loads the configuration from disk.
- func LoadConfig(file string) (*Config, error) {
- cfg := &Config{
- Listen: "unix:///var/run/app.sock",
- Protocol: "socket",
- PersistInterval: 1,
- }
- _, err := toml.DecodeFile(file, &cfg)
- if err != nil {
- return nil, fmt.Errorf("failed to load config from %q: %w", file, err)
- }
- return cfg, cfg.Validate()
- }
-
- // Validate validates the configuration. We don't do exhaustive config
- // validation here, instead relying on Testnet.Validate() to handle it.
- func (cfg Config) Validate() error {
- switch {
- case cfg.ChainID == "":
- return errors.New("chain_id parameter is required")
- case cfg.Listen == "" && cfg.Protocol != "builtin":
- return errors.New("listen parameter is required")
- default:
- return nil
- }
- }
|