@@ -2,6 +2,7 @@ package generator
2
2
3
3
import (
4
4
"fmt"
5
+ "sort"
5
6
6
7
"github.com/codingconcepts/dg/internal/pkg/model"
7
8
"github.com/samber/lo"
@@ -12,8 +13,44 @@ type ConstGenerator struct {
12
13
Values []string `yaml:"values"`
13
14
}
14
15
15
- // Generate generates values for a column based on a series of provided values.
16
- func (g ConstGenerator ) Generate (t model.Table , c model.Column , files map [string ]model.CSVFile ) error {
16
+ // Generate values for a column based on a series of provided values.
17
+ func (g ConstGenerator ) Generate (t model.Table , files map [string ]model.CSVFile ) error {
18
+ cols := lo .Filter (t .Columns , func (c model.Column , _ int ) bool {
19
+ return c .Type == "const"
20
+ })
21
+
22
+ sortColumns (cols )
23
+
24
+ for _ , c := range cols {
25
+ var cg ConstGenerator
26
+ if err := c .Generator .UnmarshalFunc (& cg ); err != nil {
27
+ return fmt .Errorf ("parsing const process for %s.%s: %w" , t .Name , c .Name , err )
28
+ }
29
+ if err := cg .generate (t , c , files ); err != nil {
30
+ return fmt .Errorf ("generating const columns: %w" , err )
31
+ }
32
+ }
33
+
34
+ return nil
35
+ }
36
+
37
+ func sortColumns (cols []model.Column ) {
38
+ sort .Slice (cols , func (i , j int ) bool {
39
+ var g1 ConstGenerator
40
+ if err := cols [i ].Generator .UnmarshalFunc (& g1 ); err != nil {
41
+ return false
42
+ }
43
+
44
+ var g2 ConstGenerator
45
+ if err := cols [j ].Generator .UnmarshalFunc (& g2 ); err != nil {
46
+ return false
47
+ }
48
+
49
+ return len (g1 .Values ) > len (g2 .Values )
50
+ })
51
+ }
52
+
53
+ func (g ConstGenerator ) generate (t model.Table , c model.Column , files map [string ]model.CSVFile ) error {
17
54
if len (g .Values ) == 0 {
18
55
return fmt .Errorf ("no values provided for const generator" )
19
56
}
@@ -26,8 +63,11 @@ func (g ConstGenerator) Generate(t model.Table, c model.Column, files map[string
26
63
count = t .Count
27
64
}
28
65
66
+ // Repeat the values until they equal the count.
29
67
if count > len (g .Values ) {
30
- return fmt .Errorf ("wrong number of values provided for const generator (need %d, got %d)" , count , len (g .Values ))
68
+ for i := 0 ; len (g .Values ) < count ; i ++ {
69
+ g .Values = append (g .Values , g .Values [i % len (g .Values )])
70
+ }
31
71
}
32
72
33
73
AddTable (t , c .Name , g .Values , files )
0 commit comments