/
action.go
98 lines (84 loc) · 2 KB
/
action.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package cmd
import (
"fmt"
"io"
"strings"
"text/template"
"github.com/aler9/goroslib/pkg/msgconv"
)
var tplAction = template.Must(template.New("").Parse(
`//autogenerated:yes
//nolint:revive,lll
package {{ .GoPkgName }}
import (
{{- range $k, $v := .Imports }}
"{{ $k }}"
{{- end }}
)
{{ .Goal }}
{{ .Result }}
{{ .Feedback }}
type {{ .Name }}Action struct {
{{- if .RosPkgName }}
msg.Package ` + "`" + `ros:"{{ .RosPkgName }}"` + "`" + `
{{- end }}
{{ .Name }}ActionGoal
{{ .Name }}ActionResult
{{ .Name }}ActionFeedback
}
`))
// ImportAction generates Go file from an .action file and writes to the io.Writer.
func ImportAction(u string, goPkgName string, rosPkgName string, w io.Writer) error {
name := getName(u, ".action")
content, err := getContent(u)
if err != nil {
return err
}
parts := strings.Split(content, "---")
if len(parts) != 3 {
return fmt.Errorf("definition must contain a goal a result and a feedback")
}
goalDef, err := msgconv.ParseMessageDefinition(goPkgName, goPkgName, name+"ActionGoal", parts[0])
if err != nil {
return err
}
resultDef, err := msgconv.ParseMessageDefinition(goPkgName, goPkgName, name+"ActionResult", parts[1])
if err != nil {
return err
}
feedbackDef, err := msgconv.ParseMessageDefinition(goPkgName, goPkgName, name+"ActionFeedback", parts[2])
if err != nil {
return err
}
imports := make(map[string]struct{})
for i := range goalDef.Imports {
imports[i] = struct{}{}
}
for i := range resultDef.Imports {
imports[i] = struct{}{}
}
for i := range feedbackDef.Imports {
imports[i] = struct{}{}
}
goal, err := goalDef.Write()
if err != nil {
return err
}
result, err := resultDef.Write()
if err != nil {
return err
}
feedback, err := feedbackDef.Write()
if err != nil {
return err
}
return tplAction.Execute(w, map[string]interface{}{
"GoPkgName": goPkgName,
"RosPkgName": rosPkgName,
"Imports": imports,
"Goal": goal,
"Result": result,
"Feedback": feedback,
"Name": name,
})
}