@@ -2,83 +2,92 @@ package generator
22
33import (
44 "fmt"
5+ "reflect"
56 "strconv"
67 "strings"
78)
89
910type TaskName string
1011
11- const (
12- GenInt32 TaskName = "GenInt32"
13- )
12+ type Task interface {
13+ GenerationFunction (taskProperties TaskProperties ) GenerationFunction
14+ ExpectedParameterCount () int
15+ Name () string
16+ }
17+
18+ var tasks map [string ]Task
1419
15- type Task struct {
16- Name TaskName
17- Parameters string
20+ func init () {
21+ tasks = make (map [string ]Task )
22+ }
23+
24+ type TaskProperties struct {
25+ TaskName string
26+ Parameters []string
1827 FieldName string
1928}
2029
21- type GenInt32Params struct {
22- min int32
23- max int32
30+ func GetTask (task string ) Task {
31+ return tasks [task ]
2432}
2533
26- func (t * Task ) GenInt32Params () GenInt32Params {
27- params := strings .Split (t .Parameters , "," )
34+ func AddTask (task Task ) error {
35+ name := task .Name ()
36+ if tasks [name ] != nil {
37+ return fmt .Errorf ("Task with name %s already exists" , name )
38+ }
39+ tasks [name ] = task
40+ return nil
41+ }
2842
29- if len (params ) != 2 {
30- panic (fmt .Sprintf ("error with field %s: task %s: task requires 2 parameters but has %d" , t .FieldName , t .Name , len (params )))
43+ func getParameters (parameterCount int , tags reflect.StructTag ) (parameters []string ) {
44+ for i := 1 ; i <= parameterCount ; i ++ {
45+ parameters = append (parameters , tags .Get (fmt .Sprintf ("gen_task_%d" , i )))
3146 }
32- param_1 , err := strconv .Atoi (params [0 ])
33- if err != nil {
34- panic (fmt .Sprintf ("error with field %s: task %s error: %s" , t .FieldName , t .Name , err ))
47+ return parameters
48+ }
49+
50+ func CreateTaskProperties (fieldName string , tags reflect.StructTag ) (* TaskProperties , error ) {
51+ gen_task_tag := strings .TrimSpace (tags .Get ("gen_task" ))
52+ leftBraceIndex := strings .Index (gen_task_tag , "(" )
53+ if leftBraceIndex == - 1 {
54+ return nil , fmt .Errorf ("error with field %s: task %s error: no ( found" , fieldName , gen_task_tag )
3555 }
3656
37- param_2 , err := strconv .Atoi (params [1 ])
57+ if gen_task_tag [len (gen_task_tag )- 1 :] != ")" {
58+ return nil , fmt .Errorf ("error with field %s: task %s error: last character of task must be )" , fieldName , gen_task_tag )
59+ }
60+ taskName := gen_task_tag [:leftBraceIndex ]
61+ parameterCount , err := strconv .Atoi (gen_task_tag [leftBraceIndex + 1 : len (gen_task_tag )- 1 ])
3862 if err != nil {
39- panic ( fmt .Sprintf ("error with field %s: task %s error : %s " , t . FieldName , t . Name , err ) )
63+ return nil , fmt .Errorf ("error getting task parameter count : %w " , err )
4064 }
4165
42- if param_1 > param_2 {
43- err = fmt .Errorf ("min must be less or equal to the max value min = %d max = %d" , param_1 , param_2 )
44- panic (fmt .Sprintf ("error with field %s: task %s error: %s" , t .FieldName , t .Name , err ))
66+ return & TaskProperties {
67+ TaskName : taskName ,
68+ Parameters : getParameters (parameterCount , tags ),
69+ FieldName : fieldName ,
70+ }, nil
71+ }
4572
46- }
73+ func GetTagForTask ( name TaskName , params ... any ) reflect. StructTag {
4774
48- return GenInt32Params {
49- min : int32 (param_1 ),
50- max : int32 (param_2 ),
75+ if tasks [string (name )] == nil {
76+ panic (fmt .Sprintf ("Task '%s' is not registered" , name ))
5177 }
52- }
5378
54- func getTask (task string , fieldName string ) Task {
55- task = strings .TrimSpace (task )
56- leftBraceIndex := strings .Index (task , "(" )
57- if leftBraceIndex == - 1 {
58- panic (fmt .Sprintf ("error with field %s: task %s error: no ( found" , fieldName , task ))
79+ tags := fmt .Sprintf (`gen_task:"%s(%d)"` , name , len (params ))
80+ for i , p := range params {
81+ tags += fmt .Sprintf (` gen_task_%d:"%v"` , (i + 1 ), p )
5982 }
6083
61- if task [len (task )- 1 :] != ")" {
62- panic (fmt .Sprintf ("error with field %s: task %s error: last character of task must be )" , fieldName , task ))
63- }
64- taskName := task [:leftBraceIndex ]
65- parameters := task [leftBraceIndex + 1 : len (task )- 1 ]
66- return Task {
67- Name : TaskName (taskName ),
68- Parameters : parameters ,
69- FieldName : fieldName ,
70- }
84+ return reflect .StructTag (tags )
85+
7186}
7287
73- func (t Task ) getFunction () GenerationFunction {
74- switch t .Name {
75- case GenInt32 :
76- params := t .GenInt32Params ()
77- return GenerateNumberFunc (params .min , params .max )
88+ func validateParamCount (task Task , taskProperties TaskProperties ) {
89+ if len (taskProperties .Parameters ) != task .ExpectedParameterCount () {
90+ panic (fmt .Sprintf ("error with field %s. task '%s': task requires %d parameters but has %d" , taskProperties .FieldName , task .Name (), task .ExpectedParameterCount (), len (taskProperties .Parameters )))
7891 }
79- panic (fmt .Sprintf ("Invalid task name '%s' for field %s " , t .Name , t .FieldName ))
80- }
8192
82- func GetTagsForGenInt32Task (min int32 , max int32 ) string {
83- return fmt .Sprintf (`gen_task:"%s(%d,%d)"` , GenInt32 , min , max )
8493}
0 commit comments