cmd/utils.go
author Mikael Berthe <mikael@lilotux.net>
Sun, 07 May 2017 16:38:52 +0200
changeset 85 a4464c0b0c36
parent 83 57afac822019
child 89 3758bb5f0979
permissions -rw-r--r--
Add theme support
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
// Copyright © 2017 Mikael Berthe <mikael@lilotux.net>
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
//
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
// Licensed under the MIT license.
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
// Please see the LICENSE file is this directory.
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
package cmd
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
import (
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
	"fmt"
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
	"io/ioutil"
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
	"os"
82
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    12
	"path/filepath"
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    13
	"strings"
80
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
	"github.com/pkg/errors"
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
	"github.com/spf13/cobra"
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
	"github.com/spf13/viper"
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
	"github.com/McKael/madonctl/printer"
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
)
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
func checkOutputFormat(cmd *cobra.Command, args []string) error {
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
	of := viper.GetString("output")
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
	switch of {
85
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    25
	case "", "plain", "json", "yaml", "template", "theme":
80
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
		return nil // Accepted
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
	}
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
	return errors.Errorf("output format '%s' not supported", of)
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
}
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
// getOutputFormat return the requested output format, defaulting to "plain".
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
func getOutputFormat() string {
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
	of := viper.GetString("output")
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
	if of == "" {
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
		of = "plain"
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
	}
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
	// Override format if a template is provided
85
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    38
	if of == "plain" {
80
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
		// If the format is plain and there is a template option,
85
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    40
		// set the format to "template".  Same for "theme".
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    41
		if outputTemplate != "" || outputTemplateFile != "" {
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    42
			of = "template"
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    43
		} else if outputTheme != "" {
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    44
			of = "theme"
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    45
		}
80
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
	}
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
	return of
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
}
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
// getPrinter returns a resource printer for the requested output format.
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
func getPrinter() (printer.ResourcePrinter, error) {
83
57afac822019 Use a map for ResourcePrinter options
Mikael Berthe <mikael@lilotux.net>
parents: 82
diff changeset
    52
	opt := make(printer.Options)
80
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
	of := getOutputFormat()
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
	// Initialize color mode
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
	switch viper.GetString("color") {
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
	case "on", "yes", "force":
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
		printer.ColorMode = 1
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
	case "off", "no":
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
		printer.ColorMode = 2
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
	}
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
85
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    63
	if of == "theme" {
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    64
		opt["name"] = outputTheme
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    65
		opt["template_directory"] = viper.GetString("template_directory")
a4464c0b0c36 Add theme support
Mikael Berthe <mikael@lilotux.net>
parents: 83
diff changeset
    66
	} else if of == "template" {
83
57afac822019 Use a map for ResourcePrinter options
Mikael Berthe <mikael@lilotux.net>
parents: 82
diff changeset
    67
		opt["template"] = outputTemplate
80
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
		if outputTemplateFile != "" {
82
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    69
			tmpl, err := readTemplate(outputTemplateFile, viper.GetString("template_directory"))
80
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
			if err != nil {
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
				return nil, err
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
			}
83
57afac822019 Use a map for ResourcePrinter options
Mikael Berthe <mikael@lilotux.net>
parents: 82
diff changeset
    73
			opt["template"] = string(tmpl)
80
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
		}
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
	}
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
	return printer.NewPrinter(of, opt)
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
}
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    78
82
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    79
func readTemplate(name, templateDir string) ([]byte, error) {
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    80
	if strings.HasPrefix(name, "/") || strings.HasPrefix(name, "./") || strings.HasPrefix(name, "../") {
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    81
		return ioutil.ReadFile(name)
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    82
	}
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    83
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    84
	if templateDir != "" {
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    85
		// If the template file can be found in the template directory,
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    86
		// use this file.
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    87
		fullName := filepath.Join(templateDir, name)
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    88
		if fileExists(fullName) {
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    89
			name = fullName
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    90
		}
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    91
	}
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    92
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    93
	return ioutil.ReadFile(name)
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    94
}
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    95
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    96
func fileExists(filename string) bool {
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    97
	if _, err := os.Stat(filename); err != nil {
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    98
		return false
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
    99
	}
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
   100
	return true
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
   101
}
9ac2281c07d7 Add 'template_directory' setting
Mikael Berthe <mikael@lilotux.net>
parents: 80
diff changeset
   102
80
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   103
func errPrint(format string, a ...interface{}) (n int, err error) {
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   104
	return fmt.Fprintf(os.Stderr, format+"\n", a...)
7f3e2577ed85 Add cmd/utils.go
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   105
}