Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
kardolus
GitHub Repository: kardolus/chatgpt-cli
Path: blob/main/agent/planexec/template_step.go
3434 views
1
package planexec
2
3
import (
4
"bytes"
5
"fmt"
6
"github.com/kardolus/chatgpt-cli/agent/types"
7
"text/template"
8
)
9
10
// ApplyTemplate applies Go templates in Step string fields using ExecContext.
11
// If a field contains no "{{", it’s returned unchanged.
12
func ApplyTemplate(step types.Step, ctx types.ExecContext) (types.Step, error) {
13
var err error
14
15
step.Description, err = renderMaybe(step.Description, ctx)
16
if err != nil {
17
return types.Step{}, fmt.Errorf("render Description: %w", err)
18
}
19
20
switch step.Type {
21
case types.ToolShell:
22
step.Command, err = renderMaybe(step.Command, ctx)
23
if err != nil {
24
return types.Step{}, fmt.Errorf("render Command: %w", err)
25
}
26
for i := range step.Args {
27
step.Args[i], err = renderMaybe(step.Args[i], ctx)
28
if err != nil {
29
return types.Step{}, fmt.Errorf("render Args[%d]: %w", i, err)
30
}
31
}
32
33
case types.ToolLLM:
34
step.Prompt, err = renderMaybe(step.Prompt, ctx)
35
if err != nil {
36
return types.Step{}, fmt.Errorf("render Prompt: %w", err)
37
}
38
39
case types.ToolFiles:
40
step.Op, err = renderMaybe(step.Op, ctx)
41
if err != nil {
42
return types.Step{}, fmt.Errorf("render Op: %w", err)
43
}
44
step.Path, err = renderMaybe(step.Path, ctx)
45
if err != nil {
46
return types.Step{}, fmt.Errorf("render Path: %w", err)
47
}
48
step.Data, err = renderMaybe(step.Data, ctx)
49
if err != nil {
50
return types.Step{}, fmt.Errorf("render Data: %w", err)
51
}
52
}
53
54
return step, nil
55
}
56
57
func renderMaybe(s string, ctx types.ExecContext) (string, error) {
58
if !containsTemplateMarker(s) {
59
return s, nil
60
}
61
62
tpl, err := template.New("step").Option("missingkey=error").Parse(s)
63
if err != nil {
64
return "", err
65
}
66
67
var buf bytes.Buffer
68
if err := tpl.Execute(&buf, ctx); err != nil {
69
return "", err
70
}
71
return buf.String(), nil
72
}
73
74
func containsTemplateMarker(s string) bool {
75
for i := 0; i < len(s)-1; i++ {
76
if s[i] == '{' && s[i+1] == '{' {
77
return true
78
}
79
}
80
return false
81
}
82
83