94 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Package memory is a memory source
 | 
						|
package memory
 | 
						|
 | 
						|
import (
 | 
						|
	"sync"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/micro/go-micro/config/source"
 | 
						|
	"github.com/pborman/uuid"
 | 
						|
)
 | 
						|
 | 
						|
type memory struct {
 | 
						|
	sync.RWMutex
 | 
						|
	ChangeSet *source.ChangeSet
 | 
						|
	Watchers  map[string]*watcher
 | 
						|
}
 | 
						|
 | 
						|
func (s *memory) Read() (*source.ChangeSet, error) {
 | 
						|
	s.RLock()
 | 
						|
	cs := &source.ChangeSet{
 | 
						|
		Timestamp: s.ChangeSet.Timestamp,
 | 
						|
		Data:      s.ChangeSet.Data,
 | 
						|
		Checksum:  s.ChangeSet.Checksum,
 | 
						|
		Source:    s.ChangeSet.Source,
 | 
						|
	}
 | 
						|
	s.RUnlock()
 | 
						|
	return cs, nil
 | 
						|
}
 | 
						|
 | 
						|
func (s *memory) Watch() (source.Watcher, error) {
 | 
						|
	w := &watcher{
 | 
						|
		Id:      uuid.NewUUID().String(),
 | 
						|
		Updates: make(chan *source.ChangeSet, 100),
 | 
						|
		Source:  s,
 | 
						|
	}
 | 
						|
 | 
						|
	s.Lock()
 | 
						|
	s.Watchers[w.Id] = w
 | 
						|
	s.Unlock()
 | 
						|
	return w, nil
 | 
						|
}
 | 
						|
 | 
						|
// Update allows manual updates of the config data.
 | 
						|
func (s *memory) Update(c *source.ChangeSet) {
 | 
						|
	// don't process nil
 | 
						|
	if c == nil {
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	// hash the file
 | 
						|
	s.Lock()
 | 
						|
	// update changeset
 | 
						|
	s.ChangeSet = &source.ChangeSet{
 | 
						|
		Data:      c.Data,
 | 
						|
		Format:    c.Format,
 | 
						|
		Source:    "memory",
 | 
						|
		Timestamp: time.Now(),
 | 
						|
	}
 | 
						|
	s.ChangeSet.Checksum = s.ChangeSet.Sum()
 | 
						|
 | 
						|
	// update watchers
 | 
						|
	for _, w := range s.Watchers {
 | 
						|
		select {
 | 
						|
		case w.Updates <- s.ChangeSet:
 | 
						|
		default:
 | 
						|
		}
 | 
						|
	}
 | 
						|
	s.Unlock()
 | 
						|
}
 | 
						|
 | 
						|
func (s *memory) String() string {
 | 
						|
	return "memory"
 | 
						|
}
 | 
						|
 | 
						|
func NewSource(opts ...source.Option) source.Source {
 | 
						|
	var options source.Options
 | 
						|
	for _, o := range opts {
 | 
						|
		o(&options)
 | 
						|
	}
 | 
						|
 | 
						|
	s := &memory{
 | 
						|
		Watchers: make(map[string]*watcher),
 | 
						|
	}
 | 
						|
 | 
						|
	if options.Context != nil {
 | 
						|
		c, ok := options.Context.Value(changeSetKey{}).(*source.ChangeSet)
 | 
						|
		if ok {
 | 
						|
			s.Update(c)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return s
 | 
						|
}
 |