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

cmd/write.go   A

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 47
dl 0
loc 75
rs 10
c 0
b 0
f 0

1 Method

Rating   Name   Duplication   Size   Complexity  
B cmd.writeHandler 0 36 5
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