2015-09-07 16:25:13 +03:00
package main
import (
"gopkg.in/fsnotify.v1"
"github.com/BurntSushi/toml"
2015-09-07 18:39:22 +03:00
"os"
"path/filepath"
"strings"
2015-09-07 16:25:13 +03:00
)
type FileProvider struct {
2015-09-07 19:10:33 +03:00
Watch bool
2015-09-07 18:39:22 +03:00
Filename string
2015-09-07 16:25:13 +03:00
}
2015-09-11 20:32:23 +03:00
func NewFileProvider ( ) * FileProvider {
fileProvider := new ( FileProvider )
// default values
fileProvider . Watch = true
return fileProvider
}
2015-09-08 01:15:14 +03:00
func ( provider * FileProvider ) Provide ( configurationChan chan <- * Configuration ) {
2015-09-07 16:25:13 +03:00
watcher , err := fsnotify . NewWatcher ( )
if err != nil {
2015-09-11 17:37:13 +03:00
log . Error ( "Error creating file watcher" , err )
2015-09-07 18:39:22 +03:00
return
2015-09-07 16:25:13 +03:00
}
defer watcher . Close ( )
2015-09-07 18:39:22 +03:00
file , err := os . Open ( provider . Filename )
2015-09-07 16:25:13 +03:00
if err != nil {
2015-09-11 17:37:13 +03:00
log . Error ( "Error opening file" , err )
2015-09-07 18:39:22 +03:00
return
2015-09-07 16:25:13 +03:00
}
2015-09-07 18:39:22 +03:00
defer file . Close ( )
2015-09-07 16:25:13 +03:00
done := make ( chan bool )
// Process events
go func ( ) {
for {
select {
case event := <- watcher . Events :
2015-09-07 18:39:22 +03:00
if ( strings . Contains ( event . Name , file . Name ( ) ) ) {
2015-09-11 17:37:13 +03:00
log . Debug ( "File event:" , event )
2015-09-08 01:15:14 +03:00
configuration := provider . LoadFileConfig ( file . Name ( ) )
if ( configuration != nil ) {
configurationChan <- configuration
2015-09-08 00:25:07 +03:00
}
2015-09-07 18:39:22 +03:00
}
2015-09-07 16:25:13 +03:00
case error := <- watcher . Errors :
2015-09-11 17:37:13 +03:00
log . Error ( "Watcher event error" , error )
2015-09-07 16:25:13 +03:00
}
}
} ( )
2015-09-07 19:10:33 +03:00
if ( provider . Watch ) {
err = watcher . Add ( filepath . Dir ( file . Name ( ) ) )
}
2015-09-07 18:39:22 +03:00
if err != nil {
2015-09-11 17:37:13 +03:00
log . Error ( "Error adding file watcher" , err )
2015-09-07 18:39:22 +03:00
return
}
2015-09-07 16:25:13 +03:00
2015-09-07 16:25:13 +03:00
2015-09-08 01:15:14 +03:00
configuration := provider . LoadFileConfig ( file . Name ( ) )
configurationChan <- configuration
2015-09-07 16:25:13 +03:00
<- done
}
2015-09-08 01:15:14 +03:00
func ( provider * FileProvider ) LoadFileConfig ( filename string ) * Configuration {
configuration := new ( Configuration )
if _ , err := toml . DecodeFile ( filename , configuration ) ; err != nil {
2015-09-11 17:37:13 +03:00
log . Error ( "Error reading file:" , err )
2015-09-07 16:25:13 +03:00
return nil
}
2015-09-08 01:15:14 +03:00
return configuration
2015-09-07 16:25:13 +03:00
}