Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions engine/cld/legacy/cli/mcmsv2/mcms_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -733,7 +733,10 @@ func buildMCMSv2AnalyzeProposalCmd(
}

// Set renderer based on format flag
renderer := createRendererFromFormat(format)
renderer, err := createRendererFromFormat(format)
if err != nil {
return fmt.Errorf("failed to create renderer: %w", err)
}
cfgv2.proposalCtx.SetRenderer(renderer)

var analyzedProposal string
Expand Down Expand Up @@ -1611,14 +1614,16 @@ func addCallProxyOption(

// createRendererFromFormat creates an appropriate renderer based on the format string.
// Defaults to markdown renderer for unknown formats.
func createRendererFromFormat(format string) analyzer.Renderer {
func createRendererFromFormat(format string) (analyzer.Renderer, error) {
switch format {
case "text", "txt":
return analyzer.NewTextRenderer()
return analyzer.NewTextRenderer(), nil
case "markdown", "md":
return analyzer.NewMarkdownRenderer()
return analyzer.NewMarkdownRenderer(), nil
case "":
return analyzer.NewMarkdownRenderer(), nil
default:
// Default to markdown if format is not specified or invalid
return analyzer.NewMarkdownRenderer()
// error if format is not specified or invalid
return nil, fmt.Errorf("unknown format '%s'", format)
}
}
1 change: 0 additions & 1 deletion experimental/analyzer/decoded_call_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,6 @@ Method: complexCall
Inputs:
address: 0x0000000000000000000000000000000000000001
chain: ` + "`" + `1 (<chain unknown>)` + "`" + `

data: 0x010203

Outputs:
Expand Down
4 changes: 2 additions & 2 deletions experimental/analyzer/describe_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func TestDescribeProposal(t *testing.T) {
name: "Empty proposal",
operations: []types.Operation{},
expectError: false,
outputContains: []string{""},
outputContains: []string{"\n"},
},
{
name: "Single operation - unsupported chain",
Expand Down Expand Up @@ -128,7 +128,7 @@ func TestDescribeTimelockProposal(t *testing.T) {
name: "Empty proposal",
operations: []types.BatchOperation{},
expectError: false,
outputContains: []string{""},
outputContains: []string{"\n"},
},
{
name: "Single batch - unsupported chain",
Expand Down
7 changes: 6 additions & 1 deletion experimental/analyzer/renderer_markdown.go
Original file line number Diff line number Diff line change
Expand Up @@ -608,7 +608,12 @@ func (r *MarkdownRenderer) renderTemplate(tmpl *template.Template, data interfac
return fmt.Sprintf("Error rendering template: %v", err)
}

return buf.String()
out := buf.String()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit/noaction: I still think you could avoid the undesired new line characters by inserting the appropriate dashes to the templates.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let me just use one example. I find the suggested patch more readable and more maintainable:

index 32037d2..e9fafa9 100644
--- i/experimental/analyzer/templates/text/decoded_call.tmpl
+++ w/experimental/analyzer/templates/text/decoded_call.tmpl
@@ -1,9 +1,14 @@
 Address: {{.Address}}
 Method: {{.Method}}
-{{if .Inputs}}
+{{- if .Inputs}}
 Inputs:
-{{range .Inputs}}  {{.Name}}: {{.Summary}}{{if .Details}} {{.Details}}{{end}}
-{{end}}{{end}}{{if .Outputs}}{{if .Inputs}}
-{{end}}Outputs:
-{{range .Outputs}}  {{.Name}}: {{.Summary}}{{if .Details}} {{.Details}}{{end}}
-{{end}}{{end}}
+{{- range .Inputs}}
+  {{.Name}}: {{.Summary}}{{if .Details}} {{.Details}}{{end}}
+{{- end}}
+{{- end}}
+{{- if .Outputs}}
+  Outputs:
+{{- range .Outputs}}
+  {{.Name}}: {{.Summary}}{{if .Details}} {{.Details}}{{end}}
+{{- end}}
+{{- end}}

if !strings.HasSuffix(out, "\n\n") { // assuming double newline means intentional spacing
out = strings.TrimSuffix(out, "\n")
}

return out
}

// isSimpleValue determines if a string represents a simple value that should be displayed without backticks.
Expand Down
43 changes: 31 additions & 12 deletions experimental/analyzer/renderer_text.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"embed"
"fmt"
"strings"
"text/template"

"github.com/ethereum/go-ethereum/common/hexutil"
Expand Down Expand Up @@ -132,8 +133,10 @@ func (r *TextRenderer) RenderDecodedCall(d *DecodedCall, ctx *FieldContext) stri
if err := r.decodedCallTmpl.Execute(&buf, data); err != nil {
return fmt.Sprintf("Error rendering decoded call: %v", err)
}
out := buf.String()
out = strings.TrimSuffix(out, "\n")

return buf.String()
return out
}

// RenderProposal renders a ProposalReport as plain text using templates
Expand All @@ -156,7 +159,12 @@ func (r *TextRenderer) RenderProposal(rep *ProposalReport, ctx *FieldContext) st
return fmt.Sprintf("Error rendering proposal: %v", err)
}

return buf.String()
out := buf.String()
if !strings.HasSuffix(out, "\n\n") { // assuming double newline means intentional spacing
out = strings.TrimSuffix(out, "\n")
}

return out
}

// RenderTimelockProposal renders a Timelock ProposalReport as plain text using templates
Expand Down Expand Up @@ -188,7 +196,12 @@ func (r *TextRenderer) RenderTimelockProposal(rep *ProposalReport, ctx *FieldCon
return fmt.Sprintf("Error rendering timelock: %v", err)
}

return buf.String()
out := buf.String()
if !strings.HasSuffix(out, "\n\n") { // assuming double newline means intentional spacing
out = strings.TrimSuffix(out, "\n")
}

return out
}

// RenderField renders a NamedField as plain text
Expand Down Expand Up @@ -225,66 +238,72 @@ func (r *TextRenderer) getChainNameOrEmpty(selector uint64) string {
// renderFieldValue renders any field value as plain text using templates
func (r *TextRenderer) renderFieldValue(field FieldValue) string {
var buf bytes.Buffer

var out string
switch f := field.(type) {
case AddressField:
data := AddressFieldData{Value: f.GetValue()}
if err := r.addressFieldTmpl.Execute(&buf, data); err != nil {
return fmt.Sprintf("Error rendering address field: %v", err)
}

return buf.String()
out = buf.String()

case ChainSelectorField:
if err := r.chainSelectorFieldTmpl.Execute(&buf, f); err != nil {
return fmt.Sprintf("Error rendering chain selector field: %v", err)
}

return buf.String()
out = buf.String()

case BytesField:
if err := r.bytesFieldTmpl.Execute(&buf, f); err != nil {
return fmt.Sprintf("Error rendering bytes field: %v", err)
}

return buf.String()
out = buf.String()

case ArrayField:
if err := r.arrayFieldTmpl.Execute(&buf, f); err != nil {
return fmt.Sprintf("Error rendering array field: %v", err)
}

return buf.String()
out = buf.String()

case StructField:
if err := r.structFieldTmpl.Execute(&buf, f); err != nil {
return fmt.Sprintf("Error rendering struct field: %v", err)
}

return buf.String()
out = buf.String()

case SimpleField:
if err := r.simpleFieldTmpl.Execute(&buf, f); err != nil {
return fmt.Sprintf("Error rendering simple field: %v", err)
}

return buf.String()
out = buf.String()

case YamlField:
if err := r.yamlFieldTmpl.Execute(&buf, f); err != nil {
return fmt.Sprintf("Error rendering yaml field: %v", err)
}

return buf.String()
out = buf.String()

case NamedField:
if err := r.namedFieldTmpl.Execute(&buf, f); err != nil {
return fmt.Sprintf("Error rendering named field: %v", err)
}

return buf.String()
out = buf.String()

default:
return fmt.Sprintf("<unknown field type: %s>", field.GetType())
}

if !strings.HasSuffix(out, "\n\n") { // assuming double newline means intentional spacing
out = strings.TrimSuffix(out, "\n")
}

return out
}
2 changes: 1 addition & 1 deletion experimental/analyzer/renderer_text_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ func TestTextRenderer_RenderField_ChainSelectorField(t *testing.T) {
field := ChainSelectorField{Value: 999999}
result := renderer.RenderField(NamedField{Name: "chain", Value: field}, ctx)

assert.Equal(t, "chain: `999999 (<chain unknown>)`\n", result)
assert.Equal(t, "chain: `999999 (<chain unknown>)`", result)
})
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
`{{.Value}}`
`{{.Value}}`
Original file line number Diff line number Diff line change
@@ -1 +1 @@
array[{{.Length}}]: {{if eq .Length 0}}[]{{else}}[{{range $i, $elem := .Elements}}{{if $i}}, {{end}}{{compactValue $elem $.Context}}{{end}}{{if gt .Length 3}}, … (+{{sub .Length 3}}){{end}}]{{end}}
array[{{.Length}}]: {{if eq .Length 0}}[]{{else}}[{{range $i, $elem := .Elements}}{{if $i}}, {{end}}{{compactValue $elem $.Context}}{{end}}{{if gt .Length 3}}, … (+{{sub .Length 3}}){{end}}]{{end}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bytes(len={{.Length}}): {{hexPreview .Value 16}}
bytes(len={{.Length}}): {{hexPreview .Value 16}}
2 changes: 1 addition & 1 deletion experimental/analyzer/templates/markdown/proposal.tmpl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{range $i, $op := .Operations}}Operation #{{$i}}
Chain selector: {{$op.ChainSelector}} ({{$op.ChainName}})
{{range $call := $op.Calls}}{{indent (renderCall $call $.Context)}}{{end}}
{{end}}
{{end}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{if gt (len .Value) 80}}`{{truncateMiddle .Value 80}}` (len={{len .Value}}){{else}}`{{.Value}}`{{end}}
{{if gt (len .Value) 80}}`{{truncateMiddle .Value 80}}` (len={{len .Value}}){{else}}`{{.Value}}`{{end}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
struct{ {{.FieldCount}} fields }
struct{ {{.FieldCount}} fields }
2 changes: 1 addition & 1 deletion experimental/analyzer/templates/markdown/summary.tmpl
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{if .Type}}{{.Type}}{{if .Length}}(len={{.Length}}){{end}}{{if .Preview}}{{if hasPrefix .Preview ":"}}{{.Preview}}{{else}}: {{.Preview}}{{end}}{{end}}{{else}}`{{.Value}}`{{end}}
{{if .Type}}{{.Type}}{{if .Length}}(len={{.Length}}){{end}}{{if .Preview}}{{if hasPrefix .Preview ":"}}{{.Preview}}{{else}}: {{.Preview}}{{end}}{{end}}{{else}}`{{.Value}}`{{end}}
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@

{{end}}{{end}}---

{{end}}
{{end}}
2 changes: 1 addition & 1 deletion experimental/analyzer/templates/markdown/yaml_field.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
{{.Value}}
{{- else -}}
`{{.Value}}`
{{- end -}}
{{- end -}}
2 changes: 1 addition & 1 deletion experimental/analyzer/templates/text/address_field.tmpl
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{.Value}}
{{.Value}}
2 changes: 1 addition & 1 deletion experimental/analyzer/templates/text/array_field.tmpl
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{range $i, $element := .GetElements}}{{if $i}}, {{end}}{{renderField $element}}{{end}}
{{range $i, $element := .GetElements}}{{if $i}}, {{end}}{{renderField $element}}{{end}}
2 changes: 1 addition & 1 deletion experimental/analyzer/templates/text/bytes_field.tmpl
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{hexEncode .GetValue}}
{{hexEncode .GetValue}}
2 changes: 1 addition & 1 deletion experimental/analyzer/templates/text/decoded_call.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ Inputs:
{{end}}{{end}}{{if .Outputs}}{{if .Inputs}}
{{end}}Outputs:
{{range .Outputs}} {{.Name}}: {{.Summary}}{{if .Details}} {{.Details}}{{end}}
{{end}}{{end}}
{{end}}{{end}}
1 change: 0 additions & 1 deletion experimental/analyzer/templates/text/named_field.tmpl
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
{{.Name}}: {{renderField .Value}}

2 changes: 1 addition & 1 deletion experimental/analyzer/templates/text/simple_field.tmpl
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{.GetValue}}
{{.GetValue}}
2 changes: 1 addition & 1 deletion experimental/analyzer/templates/text/struct_field.tmpl
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{range $i, $field := .GetFields}}{{if $i}}, {{end}}{{.GetName}}: {{renderField .GetValue}}{{end}}
{{range $i, $field := .GetFields}}{{if $i}}, {{end}}{{.GetName}}: {{renderField .GetValue}}{{end}}
2 changes: 1 addition & 1 deletion experimental/analyzer/templates/text/yaml_field.tmpl
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{.GetValue}}
{{.GetValue}}
Loading