gql -> rpc dag-json encoding

This commit is contained in:
Roy Crihfield 2023-10-18 19:03:21 -05:00 committed by Nabarun
parent 378c6d7cde
commit 62d2d1598a
4 changed files with 42 additions and 50 deletions

View File

@ -121,7 +121,7 @@ func (q queryResolver) QueryRecords(ctx context.Context, attributes []*KeyValueI
res, err := nsQueryClient.ListRecords( res, err := nsQueryClient.ListRecords(
context.Background(), context.Background(),
&registrytypes.QueryListRecordsRequest{ &registrytypes.QueryListRecordsRequest{
Attributes: parseRequestAttributes(attributes), Attributes: toRpcAttributes(attributes),
All: (all != nil && *all), All: (all != nil && *all),
}, },
) )

View File

@ -256,60 +256,43 @@ func GetGQLAuction(auction *auctiontypes.Auction, bids []*auctiontypes.Bid) (*Au
return &gqlAuction, nil return &gqlAuction, nil
} }
func parseRequestValue(value *ValueInput) *registrytypes.QueryListRecordsRequest_ValueInput { func toRpcValue(value *ValueInput) *registrytypes.QueryListRecordsRequest_ValueInput {
if value == nil { var rpcval registrytypes.QueryListRecordsRequest_ValueInput
switch {
case value == nil:
return nil return nil
} case value.Int != nil:
var val registrytypes.QueryListRecordsRequest_ValueInput rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Int{int64(*value.Int)}
case value.Float != nil:
if value.String != nil { rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Float{*value.Float}
val.String_ = *value.String case value.String != nil:
val.Type = "string" rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_String_{*value.String}
} case value.Boolean != nil:
rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Boolean{*value.Boolean}
if value.Int != nil { case value.Link != nil:
val.Int = int64(*value.Int) rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Link{value.Link.String()}
val.Type = "int" case value.Array != nil:
} var contents registrytypes.QueryListRecordsRequest_ArrayInput
for _, val := range value.Array {
if value.Float != nil { contents.Values = append(contents.Values, toRpcValue(val))
val.Float = *value.Float
val.Type = "float"
}
if value.Boolean != nil {
val.Boolean = *value.Boolean
val.Type = "boolean"
}
if value.Link != nil {
reference := &registrytypes.QueryListRecordsRequest_ReferenceInput{
Id: value.Link.String(),
} }
rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Array{&contents}
val.Reference = reference case value.Map != nil:
val.Type = "reference" var contents registrytypes.QueryListRecordsRequest_MapInput
} for _, kv := range value.Map {
contents.Values[kv.Key] = toRpcValue(kv.Value)
// handle arrays
if value.Array != nil {
values := []*registrytypes.QueryListRecordsRequest_ValueInput{}
for _, v := range value.Array {
val := parseRequestValue(v)
values = append(values, val)
} }
val.Values = values rpcval.Value = &registrytypes.QueryListRecordsRequest_ValueInput_Map{&contents}
val.Type = "array"
} }
return &rpcval
return &val
} }
func parseRequestAttributes(attrs []*KeyValueInput) []*registrytypes.QueryListRecordsRequest_KeyValueInput { func toRpcAttributes(attrs []*KeyValueInput) []*registrytypes.QueryListRecordsRequest_KeyValueInput {
kvPairs := []*registrytypes.QueryListRecordsRequest_KeyValueInput{} kvPairs := []*registrytypes.QueryListRecordsRequest_KeyValueInput{}
for _, value := range attrs { for _, value := range attrs {
parsedValue := parseRequestValue(value.Value) parsedValue := toRpcValue(value.Value)
kvPair := &registrytypes.QueryListRecordsRequest_KeyValueInput{ kvPair := &registrytypes.QueryListRecordsRequest_KeyValueInput{
Key: value.Key, Key: value.Key,
Value: parsedValue, Value: parsedValue,

View File

@ -69,8 +69,7 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
{ {
Key: "type", Key: "type",
Value: &registrytypes.QueryListRecordsRequest_ValueInput{ Value: &registrytypes.QueryListRecordsRequest_ValueInput{
Type: "string", Value: &registrytypes.QueryListRecordsRequest_ValueInput_String_{"WebsiteRegistrationRecord"},
String_: "WebsiteRegistrationRecord",
}, },
}, },
}, },
@ -141,8 +140,7 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
{ {
Key: "x500state_name", Key: "x500state_name",
Value: &registrytypes.QueryListRecordsRequest_ValueInput{ Value: &registrytypes.QueryListRecordsRequest_ValueInput{
Type: "string", Value: &registrytypes.QueryListRecordsRequest_ValueInput_String_{"california"},
String_: "california",
}, },
}, },
}, },

View File

@ -21,6 +21,9 @@ import (
bank "github.com/cosmos/cosmos-sdk/x/bank/keeper" bank "github.com/cosmos/cosmos-sdk/x/bank/keeper"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
"github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/libs/log"
"github.com/ipld/go-ipld-prime/codec/dagjson"
basicnode "github.com/ipld/go-ipld-prime/node/basic"
) )
var ( var (
@ -335,6 +338,14 @@ func (k Keeper) PutRecord(ctx sdk.Context, record types.Record) {
} }
func (k Keeper) processAttributes(ctx sdk.Context, attrs map[string]any, id string, prefix string) error { func (k Keeper) processAttributes(ctx sdk.Context, attrs map[string]any, id string, prefix string) error {
np := basicnode.Prototype.Any // Pick a stle for the in-memory data.
nb := np.NewBuilder() // Create a builder.
err := dagjson.Decode(nb, bytes.NewReader(content)) // Hand the builder to decoding -- decoding will fill it in!
if err != nil {
return "", err
}
n := nb.Build() // Call 'Build' to get the resulting Node. (It's immutable!)
for key, value := range attrs { for key, value := range attrs {
if subRecord, ok := value.(map[string]any); ok { if subRecord, ok := value.(map[string]any); ok {
err := k.processAttributes(ctx, subRecord, id, key) err := k.processAttributes(ctx, subRecord, id, key)