Passed
Push — master ( 4761c3...245c16 )
by Valentin
01:56
created

cmd.writeHandler   B

Complexity

Conditions 5

Size

Total Lines 36
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 23
nop 2
dl 0
loc 36
rs 8.8613
c 0
b 0
f 0
1
package cmd
2
3
import (
4
	"github.com/spf13/cobra"
5
	"github.com/vvval/go-metadata-scanner/cmd/writecmd"
6
	"github.com/vvval/go-metadata-scanner/cmd/writecmd/operations"
7
	"github.com/vvval/go-metadata-scanner/config"
8
	"github.com/vvval/go-metadata-scanner/util"
9
	"github.com/vvval/go-metadata-scanner/util/log"
10
	"github.com/vvval/go-metadata-scanner/util/scan"
11
	"github.com/vvval/go-metadata-scanner/vars"
12
	"github.com/vvval/go-metadata-scanner/vars/metadata"
13
	"sync"
14
)
15
16
var (
17
	files      vars.Chunk
18
	filesData  []vars.File
19
	writeFlags writecmd.Flags
20
)
21
22
const poolSize int = 20
23
24
func init() {
25
	var cmd = &cobra.Command{
26
		Use:   "write",
27
		Short: "Read metadata from file and writer to images",
28
		Long: `Read metadata from file and writer to images.
29
Flags file should be a CSV file with comma-separated fields (or pass custom separator via "s" flag).
30
First column should be reserved for file names, its name is omitted.
31
Other columns should be named as keywords in a dict.yaml maps section provided
32
for proper mapping CSV data into appropriate metadata fields`,
33
		Run: writeHandler,
34
	}
35
36
	rootCmd.AddCommand(cmd)
37
	writeFlags.Fill(cmd)
38
}
39
40
func writeHandler(cmd *cobra.Command, args []string) {
41
	if writeFlags.Verbosity() {
42
		log.Visibility.Debug = true
43
		log.Visibility.Log = true
44
		log.Visibility.Command = true
45
	}
46
47
	files = scan.MustDir(writeFlags.Directory(), config.App.Extensions())
48
49
	if writeFlags.Append() {
50
		log.Log("Scanning files...", "\"Append\" flag is enabled")
51
52
		var poolSize, chunkSize = util.AdjustSizes(len(files), PoolSize, MinChunkSize)
53
		filesData = operations.ScanFiles(files.Split(chunkSize), poolSize)
54
55
		log.Log("Scanning completed", "\n")
56
	}
57
58
	var wg sync.WaitGroup
59
	jobs := make(chan *writecmd.Job)
60
	writecmd.CreatePool(&wg, poolSize, jobs, func(job *writecmd.Job) ([]byte, error) {
61
		return writecmd.Work(job, writeFlags.Append(), writeFlags.Originals(), config.App.Extensions(), &files, &filesData)
62
	})
63
64
	file := util.MustOpenReadonlyFile(writeFlags.Filename())
65
	defer file.Close()
66
67
	operations.ReadCSV(util.GetCSVReader(file, writeFlags.Separator()), config.Dict, func(filename string, payload metadata.Payload) {
68
		wg.Add(1)
69
		jobs <- writecmd.NewJob(filename, payload)
70
	})
71
72
	wg.Wait()
73
	close(jobs)
74
75
	log.Done("Writing completed", "")
76
}
77