1// Copyright © 2015 Steve Francia <spf@spf13.com>.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14package cmd
15
16import (
17	"fmt"
18
19	homedir "github.com/mitchellh/go-homedir"
20	"github.com/spf13/cobra"
21	"github.com/spf13/viper"
22)
23
24var (
25	// Used for flags.
26	cfgFile, userLicense string
27
28	rootCmd = &cobra.Command{
29		Use:   "cobra",
30		Short: "A generator for Cobra based Applications",
31		Long: `Cobra is a CLI library for Go that empowers applications.
32This application is a tool to generate the needed files
33to quickly create a Cobra application.`,
34	}
35)
36
37// Execute executes the root command.
38func Execute() {
39	rootCmd.Execute()
40}
41
42func init() {
43	cobra.OnInitialize(initConfig)
44
45	rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)")
46	rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "author name for copyright attribution")
47	rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "name of license for the project")
48	rootCmd.PersistentFlags().Bool("viper", true, "use Viper for configuration")
49	viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
50	viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper"))
51	viper.SetDefault("author", "NAME HERE <EMAIL ADDRESS>")
52	viper.SetDefault("license", "apache")
53
54	rootCmd.AddCommand(addCmd)
55	rootCmd.AddCommand(initCmd)
56}
57
58func initConfig() {
59	if cfgFile != "" {
60		// Use config file from the flag.
61		viper.SetConfigFile(cfgFile)
62	} else {
63		// Find home directory.
64		home, err := homedir.Dir()
65		if err != nil {
66			er(err)
67		}
68
69		// Search config in home directory with name ".cobra" (without extension).
70		viper.AddConfigPath(home)
71		viper.SetConfigName(".cobra")
72	}
73
74	viper.AutomaticEnv()
75
76	if err := viper.ReadInConfig(); err == nil {
77		fmt.Println("Using config file:", viper.ConfigFileUsed())
78	}
79}
80