package config import ( "encoding/json" "os" "sync" ) type Config struct { Port int `json:"port"` AdminPort int `json:"admin_port"` RootDir string `json:"root_dir"` mu sync.RWMutex } var defaultConfig = &Config{ Port: 9000, AdminPort: 9001, RootDir: "./web", } func Load(path string) (*Config, error) { cfg := defaultConfig data, err := os.ReadFile(path) if err != nil { if os.IsNotExist(err) { return cfg, nil } return nil, err } if len(data) > 0 { err = json.Unmarshal(data, &cfg) if err != nil { return nil, err } } return cfg, nil } func (c *Config) Save(path string) error { c.mu.RLock() defer c.mu.RUnlock() data, err := json.MarshalIndent(c, "", " ") if err != nil { return err } return os.WriteFile(path, data, 0644) } func (c *Config) GetPort() int { c.mu.RLock() defer c.mu.RUnlock() return c.Port } func (c *Config) SetPort(port int) { c.mu.Lock() defer c.mu.Unlock() c.Port = port } func (c *Config) GetAdminPort() int { c.mu.RLock() defer c.mu.RUnlock() return c.AdminPort } func (c *Config) GetRootDir() string { c.mu.RLock() defer c.mu.RUnlock() return c.RootDir }