Update BEB3 CLI Client to Support JSON (#597)

* add initial augmented swaps to bring cli & rest api's under same schema

* use an array type

* update to not cause breaking changes in REST API -- don't embed swap
fields
This commit is contained in:
Nick DeLuca 2020-06-22 18:34:51 -05:00 committed by GitHub
parent e81987c31f
commit 2ea75458ff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 58 additions and 11 deletions

View File

@ -204,11 +204,11 @@ func QueryGetAtomicSwapCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
return err return err
} }
var atomicSwap types.AtomicSwap var atomicSwap types.AugmentedAtomicSwap
cdc.MustUnmarshalJSON(res, &atomicSwap) cdc.MustUnmarshalJSON(res, &atomicSwap)
cliCtx = cliCtx.WithHeight(height) cliCtx = cliCtx.WithHeight(height)
return cliCtx.PrintOutput(atomicSwap.String()) return cliCtx.PrintOutput(atomicSwap)
}, },
} }
} }
@ -286,7 +286,7 @@ $ kvcli q bep3 swaps --page=2 --limit=100
return err return err
} }
var matchingAtomicSwaps types.AtomicSwaps var matchingAtomicSwaps types.AugmentedAtomicSwaps
cdc.UnmarshalJSON(res, &matchingAtomicSwaps) cdc.UnmarshalJSON(res, &matchingAtomicSwaps)
if len(matchingAtomicSwaps) == 0 { if len(matchingAtomicSwaps) == 0 {
@ -294,7 +294,7 @@ $ kvcli q bep3 swaps --page=2 --limit=100
} }
cliCtx = cliCtx.WithHeight(height) cliCtx = cliCtx.WithHeight(height)
return cliCtx.PrintOutput(matchingAtomicSwaps.String()) // nolint:errcheck return cliCtx.PrintOutput(matchingAtomicSwaps) // nolint:errcheck
}, },
} }

View File

@ -62,7 +62,7 @@ func queryAtomicSwapHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
// Decode and return results // Decode and return results
cliCtx = cliCtx.WithHeight(height) cliCtx = cliCtx.WithHeight(height)
var swap types.AtomicSwap var swap types.AugmentedAtomicSwap
err = cliCtx.Codec.UnmarshalJSON(res, &swap) err = cliCtx.Codec.UnmarshalJSON(res, &swap)
if err != nil { if err != nil {
rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())

View File

@ -81,8 +81,10 @@ func queryAtomicSwap(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]b
return nil, sdkerrors.Wrapf(types.ErrAtomicSwapNotFound, "%d", requestParams.SwapID) return nil, sdkerrors.Wrapf(types.ErrAtomicSwapNotFound, "%d", requestParams.SwapID)
} }
augmentedAtomicSwap := types.NewAugmentedAtomicSwap(atomicSwap)
// Encode results // Encode results
bz, err := codec.MarshalJSONIndent(types.ModuleCdc, atomicSwap) bz, err := codec.MarshalJSONIndent(types.ModuleCdc, augmentedAtomicSwap)
if err != nil { if err != nil {
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
} }
@ -103,7 +105,13 @@ func queryAtomicSwaps(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]
swaps = types.AtomicSwaps{} swaps = types.AtomicSwaps{}
} }
bz, err := codec.MarshalJSONIndent(types.ModuleCdc, swaps) augmentedSwaps := types.AugmentedAtomicSwaps{}
for _, swap := range swaps {
augmentedSwaps = append(augmentedSwaps, types.NewAugmentedAtomicSwap(swap))
}
bz, err := codec.MarshalJSONIndent(types.ModuleCdc, augmentedSwaps)
if err != nil { if err != nil {
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
} }

View File

@ -121,11 +121,11 @@ func (suite *QuerierTestSuite) TestQueryAtomicSwap() {
suite.NotNil(bz) suite.NotNil(bz)
// Unmarshal the bytes into type atomic swap // Unmarshal the bytes into type atomic swap
var swap types.AtomicSwap var swap types.AugmentedAtomicSwap
suite.Nil(types.ModuleCdc.UnmarshalJSON(bz, &swap)) suite.Nil(types.ModuleCdc.UnmarshalJSON(bz, &swap))
// Check the returned atomic swap's ID // Check the returned atomic swap's ID
suite.True(suite.isSwapID[hex.EncodeToString(swap.GetSwapID())]) suite.True(suite.isSwapID[swap.ID])
} }
func (suite *QuerierTestSuite) TestQueryAssetSupplies() { func (suite *QuerierTestSuite) TestQueryAssetSupplies() {
@ -161,12 +161,12 @@ func (suite *QuerierTestSuite) TestQueryAtomicSwaps() {
suite.Nil(err) suite.Nil(err)
suite.NotNil(bz) suite.NotNil(bz)
var swaps types.AtomicSwaps var swaps types.AugmentedAtomicSwaps
suite.Nil(types.ModuleCdc.UnmarshalJSON(bz, &swaps)) suite.Nil(types.ModuleCdc.UnmarshalJSON(bz, &swaps))
suite.Equal(len(suite.swapIDs), len(swaps)) suite.Equal(len(suite.swapIDs), len(swaps))
for _, swap := range swaps { for _, swap := range swaps {
suite.True(suite.isSwapID[hex.EncodeToString(swap.GetSwapID())]) suite.True(suite.isSwapID[swap.ID])
} }
} }

View File

@ -264,3 +264,42 @@ func (direction SwapDirection) IsValid() bool {
} }
return false return false
} }
type AugmentedAtomicSwap struct {
ID string `json:"id" yaml:"id"`
// Embed AtomicSwap fields explicity in order to output as top level JSON fields
// This prevents breaking changes for clients using REST API
Amount sdk.Coins `json:"amount" yaml:"amount"`
RandomNumberHash tmbytes.HexBytes `json:"random_number_hash" yaml:"random_number_hash"`
ExpireHeight uint64 `json:"expire_height" yaml:"expire_height"`
Timestamp int64 `json:"timestamp" yaml:"timestamp"`
Sender sdk.AccAddress `json:"sender" yaml:"sender"`
Recipient sdk.AccAddress `json:"recipient" yaml:"recipient"`
SenderOtherChain string `json:"sender_other_chain" yaml:"sender_other_chain"`
RecipientOtherChain string `json:"recipient_other_chain" yaml:"recipient_other_chain"`
ClosedBlock int64 `json:"closed_block" yaml:"closed_block"`
Status SwapStatus `json:"status" yaml:"status"`
CrossChain bool `json:"cross_chain" yaml:"cross_chain"`
Direction SwapDirection `json:"direction" yaml:"direction"`
}
func NewAugmentedAtomicSwap(swap AtomicSwap) AugmentedAtomicSwap {
return AugmentedAtomicSwap{
ID: hex.EncodeToString(swap.GetSwapID()),
Amount: swap.Amount,
RandomNumberHash: swap.RandomNumberHash,
ExpireHeight: swap.ExpireHeight,
Timestamp: swap.Timestamp,
Sender: swap.Sender,
Recipient: swap.Recipient,
SenderOtherChain: swap.SenderOtherChain,
RecipientOtherChain: swap.RecipientOtherChain,
ClosedBlock: swap.ClosedBlock,
Status: swap.Status,
CrossChain: swap.CrossChain,
Direction: swap.Direction,
}
}
type AugmentedAtomicSwaps []AugmentedAtomicSwap