config.go
author Ollivier Robert <roberto@keltia.net>
Fri, 07 Apr 2017 15:32:29 +0200
changeset 33 bce8b17415ae
parent 23 512f1bfaed0c
child 36 b3c341207b30
permissions -rw-r--r--
Add new error ErrAlreadyRegistered.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     1
// config.go
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     2
//
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     3
// This file implements the configuration part for when you need the API
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     4
// key to modify things in the Mastodon configuration and manage measurements.
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     5
8
6d89be3dd966 Placeholders.
Ollivier Robert <roberto@keltia.net>
parents:
diff changeset
     6
package gondole
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     7
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     8
import (
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     9
	"fmt"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    10
	"io/ioutil"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    11
	"os"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    12
	"path/filepath"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    13
	"strings"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    14
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    15
	"github.com/naoina/toml"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    16
)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    17
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    18
/*
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    19
Assume the application is registered if $HOME/.config/<gondole>/config.toml already exist
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    20
 */
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    21
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    22
const (
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    23
	DefaultName = "config.toml"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    24
)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    25
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    26
// Config holds our parameters
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    27
type Config struct {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    28
	ID           int64
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    29
	Name         string
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    30
	BearerToken  string
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    31
}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    32
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    33
// Check the parameter for either tag or filename
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    34
func checkName(file string) (str string) {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    35
	// Full path, MUST have .toml
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    36
	if bfile := []byte(file); bfile[0] == '/' {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    37
		if !strings.HasSuffix(file, ".toml") {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    38
			str = ""
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    39
		} else {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    40
			str = file
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    41
		}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    42
		return
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    43
	}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    44
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    45
	// If ending with .toml, take it literally
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    46
	if strings.HasSuffix(file, ".toml") {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    47
		str = file
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    48
		return
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    49
	}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    50
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    51
	// Check for tag
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    52
	if !strings.HasSuffix(file, ".toml") {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    53
		// file must be a tag so add a "."
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    54
		str = filepath.Join(os.Getenv("HOME"),
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    55
			fmt.Sprintf(".%s", file),
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    56
			"config.toml")
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    57
	}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    58
	return
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    59
}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    60
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    61
// LoadConfig reads a file as a TOML document and return the structure
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    62
func LoadConfig(name, redirectURL string) (c *Config, err error) {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    63
	c = new(Config)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    64
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    65
	sFile := filepath.Join(os.Getenv("HOME"),
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    66
		".config",
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    67
		"gondole",
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    68
		DefaultName,
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    69
	)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    70
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    71
	// Check if there is any config file
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    72
	if _, err := os.Stat(sFile); err != nil {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    73
		// No config file is no error
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    74
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    75
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    76
	} else {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    77
		// Read it
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    78
		buf, err := ioutil.ReadFile(sFile)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    79
		if err != nil {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    80
			return c, fmt.Errorf("Can not read %s", sFile)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    81
		}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    82
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    83
		err = toml.Unmarshal(buf, &c)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    84
		if err != nil {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    85
			return c, fmt.Errorf("Error parsing toml %s: %v",
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    86
				sFile, err)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    87
		}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    88
	}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    89
	return c, nil
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    90
}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    91
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    92
func WriteConfig(c * Config) (err error) {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    93
	sc, err := toml.Marshal(c)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    94
	if err != nil {
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    95
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    96
	}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    97
	err = ioutil.WriteFile(filepath.Join(os.Getenv("HOME"), ".config", "gondole", DefaultName), sc, 0600)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    98
	return
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    99
}