Passed
Pull Request — master (#31)
by Stefano
02:08
created

pkg/cmd/generate_dictionary.go   A

Size/Duplication

Total Lines 92
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
cc 13
eloc 56
dl 0
loc 92
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A cmd.buildGenerateDictionaryFunc 0 23 5
A cmd.getOutputForDictionaryGenerator 0 12 3
A cmd.getPath 0 17 4
A cmd.NewGenerateDictionaryCommand 0 22 1
1
package cmd
2
3
import (
4
	"fmt"
5
	"io"
6
	"os"
7
8
	"github.com/pkg/errors"
9
	"github.com/spf13/cobra"
10
	"github.com/stefanoj3/dirstalk/pkg/dictionary"
11
)
12
13
func NewGenerateDictionaryCommand() *cobra.Command {
0 ignored issues
show
introduced by
exported function NewGenerateDictionaryCommand should have comment or be unexported
Loading history...
14
	cmd := &cobra.Command{
15
		Use:   "dictionary.generate [path]",
16
		Short: "Generate a dictionary from the given folder",
17
		RunE:  buildGenerateDictionaryFunc(),
18
	}
19
20
	cmd.Flags().StringP(
21
		flagOutput,
22
		flagOutputShort,
23
		"",
24
		fmt.Sprintf("where to write the dictionary"),
25
	)
26
27
	cmd.Flags().BoolP(
28
		flagAbsolutePathOnly,
29
		"",
30
		false,
31
		"determines if the dictionary should contain only the absolute path of the files",
32
	)
33
34
	return cmd
35
}
36
37
func buildGenerateDictionaryFunc() func(cmd *cobra.Command, args []string) error {
38
	f := func(cmd *cobra.Command, args []string) error {
39
		p, err := getPath(args)
40
		if err != nil {
41
			return err
42
		}
43
44
		out, err := getOutputForDictionaryGenerator(cmd)
45
		if err != nil {
46
			return err
47
		}
48
49
		absolutePathOnly, err := cmd.Flags().GetBool(flagAbsolutePathOnly)
50
		if err != nil {
51
			return errors.Wrapf(err, "failed to retrieve %s flag", flagAbsolutePathOnly)
52
		}
53
54
		generator := dictionary.NewGenerator(out)
55
56
		return generator.GenerateDictionaryFrom(p, absolutePathOnly)
57
	}
58
59
	return f
60
}
61
62
func getOutputForDictionaryGenerator(cmd *cobra.Command) (io.Writer, error) {
63
	output := cmd.Flag(flagOutput).Value.String()
64
	if output == "" {
65
		return os.Stdout, nil
66
	}
67
68
	file, err := os.OpenFile(output, os.O_CREATE|os.O_WRONLY, 0666)
69
	if err != nil {
70
		return nil, errors.Wrap(err, "cannot write on the path provided")
71
	}
72
73
	return file, nil
74
}
75
76
func getPath(args []string) (string, error) {
77
	if len(args) == 0 {
78
		return "", errors.New("no path provided")
79
	}
80
81
	path := args[0]
82
83
	fileInfo, err := os.Stat(path)
84
	if err != nil {
85
		return "", errors.Wrap(err, "unable to use the provided path")
86
	}
87
88
	if !fileInfo.IsDir() {
89
		return "", errors.New("the path should be a directory")
90
	}
91
92
	return path, nil
93
}
94