feat:(textual) Add bool value renderer (#15863)

Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com>
This commit is contained in:
Facundo Medica 2023-04-18 12:34:44 -03:00 committed by GitHub
parent 10d7d15f04
commit 8231841a89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 74 additions and 0 deletions

View File

@ -320,6 +320,10 @@ TestData object
> Signer: cosmos1abc
```
### bool
Boolean values are rendered as `True` or `False`.
### [ABANDONED] Custom `msg_title` instead of Msg `type_url`
_This paragraph is in the Annex for informational purposes only, and will be removed in a next update of the ADR._

View File

@ -0,0 +1,37 @@
package textual
import (
"context"
"fmt"
"google.golang.org/protobuf/reflect/protoreflect"
)
type boolValueRenderer struct{}
// NewBoolValueRenderer returns a ValueRenderer for protocol buffer bool values.
// It renders the boolean as YES or NO.
func NewBoolValueRenderer() ValueRenderer {
return boolValueRenderer{}
}
func (sr boolValueRenderer) Format(_ context.Context, v protoreflect.Value) ([]Screen, error) {
str := "False"
if v.Bool() {
str = "True"
}
return []Screen{{Content: str}}, nil
}
func (sr boolValueRenderer) Parse(_ context.Context, screens []Screen) (protoreflect.Value, error) {
if len(screens) != 1 {
return protoreflect.Value{}, fmt.Errorf("expected single screen: %v", screens)
}
res := false
if screens[0].Content == "True" {
res = true
}
return protoreflect.ValueOfBool(res), nil
}

View File

@ -0,0 +1,31 @@
package textual_test
import (
"context"
"testing"
"cosmossdk.io/x/tx/signing/textual"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/reflect/protoreflect"
)
func TestBool(t *testing.T) {
// test true
rend := textual.NewBoolValueRenderer()
screens, err := rend.Format(context.Background(), protoreflect.ValueOfBool(true))
require.NoError(t, err)
require.Equal(t, 1, len(screens))
require.Equal(t, "True", screens[0].Content)
val, err := rend.Parse(context.Background(), screens)
require.NoError(t, err)
require.Equal(t, true, val.Bool())
// test false
screens, err = rend.Format(context.Background(), protoreflect.ValueOfBool(false))
require.NoError(t, err)
require.Equal(t, 1, len(screens))
require.Equal(t, "False", screens[0].Content)
val, err = rend.Parse(context.Background(), screens)
require.NoError(t, err)
require.Equal(t, false, val.Bool())
}

View File

@ -138,6 +138,8 @@ func (r *SignModeHandler) GetFieldValueRenderer(fd protoreflect.FieldDescriptor)
return nil, fmt.Errorf("value renderers cannot format value of type map")
}
return NewMessageValueRenderer(r, md), nil
case fd.Kind() == protoreflect.BoolKind:
return NewBoolValueRenderer(), nil
default:
return nil, fmt.Errorf("value renderers cannot format value of type %s", fd.Kind())