From 03890a8b501475240b343664bdfc3bacebae1cbe Mon Sep 17 00:00:00 2001 From: Laria Carolin Chabowski Date: Wed, 2 Aug 2017 08:04:28 +0200 Subject: Add config --- config/config.go | 84 +++++++++++++++++++++++++++++++++++++++++++++++ storage/memory_storage.go | 9 +++++ storage/storage.go | 9 +++++ 3 files changed, 102 insertions(+) create mode 100644 config/config.go diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..e925be3 --- /dev/null +++ b/config/config.go @@ -0,0 +1,84 @@ +package config + +import ( + "fmt" + "github.com/BurntSushi/toml" + "github.com/adrg/xdg" + "os" + "os/user" + "reflect" + "strings" +) + +type StorageConfig map[string]interface{} + +type Config struct { + DefaultStorage string `toml:"default_storage"` + Signing struct { + Key string + } + Storage map[string]StorageConfig +} + +func LoadConfig(path string) (config Config, err error) { + if path == "" { + path, err = xdg.ConfigFile("petrific/config.toml") + if err != nil { + return + } + } + + _, err = toml.DecodeFile(path, &config) + return +} + +// Get gets a value from the StorageConfig, taking care about type checking. +// ptr must be a pointer or this method will panic. +// ptr will only be changed, if returned error != nil +func (s StorageConfig) Get(k string, ptr interface{}) error { + ptrval := reflect.ValueOf(ptr) + + if ptrval.Kind() != reflect.Ptr { + panic("ptr must be a pointer") + } + + ptrelem := ptrval.Elem() + if !ptrelem.CanSet() { + panic("*ptr not settable?!") + } + + v, ok := s[k] + if !ok { + return fmt.Errorf("Key '%s' is missing", k) + } + + vval := reflect.ValueOf(v) + + if vval.Type() != ptrelem.Type() { + return fmt.Errorf("Expected config '%s' to be of type %s, got %s", k, ptrelem.Type(), vval.Type()) + } + + ptrelem.Set(vval) + return nil +} + +func ExpandTilde(path string) string { + home, ok := os.LookupEnv("HOME") + if !ok { + u, err := user.Current() + if err != nil { + return path + } + home = u.HomeDir + } + + if home == "" { + return path + } + + parts := strings.Split(path, string(os.PathSeparator)) + if len(parts) > 0 && parts[0] == "~" { + parts[0] = home + } + return strings.Join(parts, string(os.PathSeparator)) +} diff --git a/storage/memory_storage.go b/storage/memory_storage.go index 0c90981..b9ed54a 100644 --- a/storage/memory_storage.go +++ b/storage/memory_storage.go @@ -1,6 +1,7 @@ package storage import ( + "code.laria.me/petrific/config" "code.laria.me/petrific/objects" ) @@ -16,6 +17,10 @@ func NewMemoryStorage() Storage { } } +func MemoryStorageFromConfig(conf config.Config, name string) (Storage, error) { + return NewMemoryStorage(), nil +} + func (ms MemoryStorage) Get(id objects.ObjectId) ([]byte, error) { b, ok := ms.objects[id.String()] if !ok { @@ -39,3 +44,7 @@ func (ms MemoryStorage) Set(id objects.ObjectId, typ objects.ObjectType, raw []b func (ms MemoryStorage) List(typ objects.ObjectType) ([]objects.ObjectId, error) { return ms.bytype[typ], nil } + +func (MemoryStorage) Close() error { + return nil +} diff --git a/storage/storage.go b/storage/storage.go index 45b1973..0729fe1 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -2,6 +2,7 @@ package storage import ( "bytes" + "code.laria.me/petrific/config" "code.laria.me/petrific/objects" "errors" "fmt" @@ -17,6 +18,14 @@ type Storage interface { Has(id objects.ObjectId) (bool, error) Set(id objects.ObjectId, typ objects.ObjectType, raw []byte) error List(typ objects.ObjectType) ([]objects.ObjectId, error) + + Close() error +} + +type CreateStorageFromConfig func(conf config.Config, name string) (Storage, error) + +var StorageTypes = map[string]CreateStorageFromConfig{ + "memory": MemoryStorageFromConfig, } func SetObject(s Storage, o objects.RawObject) (id objects.ObjectId, err error) { -- cgit v1.2.3-54-g00ecf