go.dedis.ch/onet/v3@v3.2.11-0.20210930124529-e36530bca7ef/utils.go (about)

     1  package onet
     2  
     3  import (
     4  	"bytes"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	"github.com/BurntSushi/toml"
    10  	"go.dedis.ch/onet/v3/log"
    11  	"golang.org/x/xerrors"
    12  )
    13  
    14  // WriteTomlConfig write  any structure to a toml-file
    15  // Takes a filename and an optional directory-name.
    16  func WriteTomlConfig(conf interface{}, filename string, dirOpt ...string) {
    17  	buf := new(bytes.Buffer)
    18  	if err := toml.NewEncoder(buf).Encode(conf); err != nil {
    19  		log.Fatal(err)
    20  	}
    21  	err := ioutil.WriteFile(getFullName(filename, dirOpt...), buf.Bytes(), 0660)
    22  	if err != nil {
    23  		log.Fatal(err)
    24  	}
    25  }
    26  
    27  // ReadTomlConfig read any structure from a toml-file
    28  // Takes a filename and an optional directory-name
    29  func ReadTomlConfig(conf interface{}, filename string, dirOpt ...string) error {
    30  	buf, err := ioutil.ReadFile(getFullName(filename, dirOpt...))
    31  	if err != nil {
    32  		pwd, _ := os.Getwd()
    33  		log.Lvl1("Didn't find", filename, "in", pwd)
    34  		return xerrors.Errorf("reading file: %v", err)
    35  	}
    36  
    37  	_, err = toml.Decode(string(buf), conf)
    38  	if err != nil {
    39  		log.Fatal("failed to parse " + filename + ": " + err.Error())
    40  	}
    41  
    42  	return nil
    43  }
    44  
    45  /*
    46   * Gets filename and dirname
    47   *
    48   * special cases:
    49   * - filename only
    50   * - filename in relative path
    51   * - filename in absolute path
    52   * - filename and additional path
    53   */
    54  func getFullName(filename string, dirOpt ...string) string {
    55  	dir := filepath.Dir(filename)
    56  	if len(dirOpt) > 0 {
    57  		dir = dirOpt[0]
    58  	} else {
    59  		if dir == "" {
    60  			dir = "."
    61  		}
    62  	}
    63  	return dir + "/" + filepath.Base(filename)
    64  }