Files
nigiri/internal/state/state.go
Marco Argentieri d7650e7c1d ️ Lightning Network support (#144)
* Add two LND instances on --ln flag

* Add CLN and drop second LND instance

* Wrap lncli into lnd and lightning-cli into cln commands

* rpc: Add -generate <numOfBlocks> command

* Add special label to faucet from bitcoin to lnd,cln

* update readme

* readme: format expandable paragraph

* Allow interactive commands for cln,lnd

* fix empty address in faucet
2022-04-21 16:47:25 -05:00

118 lines
2.1 KiB
Go

package state
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strconv"
)
type State struct {
directory string
filePath string
initialState map[string]string
}
func New(filePath string, initialState map[string]string) *State {
dir := filepath.Dir(filePath)
return &State{
directory: dir,
filePath: filePath,
initialState: initialState,
}
}
func (s *State) Get() (map[string]string, error) {
file, err := ioutil.ReadFile(s.filePath)
if err != nil {
if !os.IsNotExist(err) {
return nil, err
}
if err := s.Set(s.initialState); err != nil {
return nil, err
}
return s.initialState, nil
}
data := map[string]string{}
json.Unmarshal(file, &data)
return data, nil
}
func (s *State) Set(data map[string]string) error {
if _, err := os.Stat(s.directory); os.IsNotExist(err) {
os.Mkdir(s.directory, os.ModeDir|0755)
}
file, err := os.OpenFile(s.filePath, os.O_RDONLY|os.O_CREATE, 0644)
if err != nil {
return err
}
if err := file.Close(); err != nil {
return err
}
currentData, err := s.Get()
if err != nil {
return err
}
mergedData := merge(currentData, data)
jsonString, err := json.Marshal(mergedData)
if err != nil {
return err
}
err = ioutil.WriteFile(s.filePath, jsonString, 0755)
if err != nil {
return fmt.Errorf("writing to file: %w", err)
}
return nil
}
func (s *State) GetBool(key string) (bool, error) {
stateData, err := s.Get()
if err != nil {
return false, err
}
if _, ok := stateData[key]; !ok {
return false, errors.New("config: missing key " + key)
}
value, err := strconv.ParseBool(stateData[key])
if err != nil {
return false, err
}
return value, nil
}
func (s *State) GetString(key string) (string, error) {
stateData, err := s.Get()
if err != nil {
return "", err
}
if _, ok := stateData[key]; !ok {
return "", errors.New("config: missing key " + key)
}
return stateData[key], nil
}
func merge(maps ...map[string]string) map[string]string {
merge := make(map[string]string)
for _, m := range maps {
for k, v := range m {
merge[k] = v
}
}
return merge
}