123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package config
- import (
- "encoding/json"
- "sync"
- )
- // defaultStorage implements config.Storage, providing in-memory config.
- // Indexed by section, then key.
- type defaultStorage struct {
- mu sync.RWMutex
- sections map[string]map[string]string
- }
- func newDefaultStorage() *defaultStorage {
- return &defaultStorage{
- sections: map[string]map[string]string{},
- }
- }
- // GetSectionList returns a slice of strings with names for all the sections.
- func (s *defaultStorage) GetSectionList() []string {
- s.mu.RLock()
- defer s.mu.RUnlock()
- sections := make([]string, 0, len(s.sections))
- for section := range s.sections {
- sections = append(sections, section)
- }
- return sections
- }
- // HasSection returns true if section exists in the config.
- func (s *defaultStorage) HasSection(section string) bool {
- s.mu.RLock()
- defer s.mu.RUnlock()
- _, hasSection := s.sections[section]
- return hasSection
- }
- // DeleteSection deletes the specified section.
- func (s *defaultStorage) DeleteSection(section string) {
- s.mu.Lock()
- defer s.mu.Unlock()
- delete(s.sections, section)
- }
- // GetKeyList returns the keys in this section.
- func (s *defaultStorage) GetKeyList(section string) []string {
- s.mu.RLock()
- defer s.mu.RUnlock()
- theSection := s.sections[section]
- keys := make([]string, 0, len(theSection))
- for key := range theSection {
- keys = append(keys, key)
- }
- return keys
- }
- // GetValue returns the key in section with a found flag.
- func (s *defaultStorage) GetValue(section string, key string) (value string, found bool) {
- s.mu.RLock()
- defer s.mu.RUnlock()
- theSection, hasSection := s.sections[section]
- if !hasSection {
- return "", false
- }
- value, hasValue := theSection[key]
- return value, hasValue
- }
- func (s *defaultStorage) SetValue(section string, key string, value string) {
- s.mu.Lock()
- defer s.mu.Unlock()
- theSection, hasSection := s.sections[section]
- if !hasSection {
- theSection = map[string]string{}
- s.sections[section] = theSection
- }
- theSection[key] = value
- }
- func (s *defaultStorage) DeleteKey(section string, key string) bool {
- s.mu.Lock()
- defer s.mu.Unlock()
- theSection, hasSection := s.sections[section]
- if !hasSection {
- return false
- }
- _, hasKey := theSection[key]
- if !hasKey {
- return false
- }
- delete(s.sections[section], key)
- return true
- }
- func (s *defaultStorage) Load() error {
- return nil
- }
- func (s *defaultStorage) Save() error {
- return nil
- }
- // Serialize the config into a string
- func (s *defaultStorage) Serialize() (string, error) {
- s.mu.RLock()
- defer s.mu.RUnlock()
- j, err := json.Marshal(s.sections)
- return string(j), err
- }
- // Check the interface is satisfied
- var _ Storage = newDefaultStorage()
|