I'm teachning myself Rust by building a CosmWasm contract.
Game is defined by
use cosmwasm_std::{Addr, Int256};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)]
pub struct Game {
id: u64,
owner: Addr,
round: Int256, // as close to infinite number of rounds as I can think of
status: GameStatus,
slots: [Slot; 9],
}
(Slot is another struct, and GameStatus is an enum, all prefixed with their own #[derive... macros.)
I have defined a Map of Games as follows
use cw_storage_plus::{Item, Map};
pub const GAMES: Item<Map<u64, Game>> = Item::new("games");
In my contract's instantiate function I have the following
// game is an instance of a Game
GAMES.save(deps.storage, 0, &game)?;
GAMES.save shows error
the method `save` exists for struct `Item<'static, Map<'static, u64, Game>>`, but its trait bounds were not satisfied
the following trait bounds were not satisfied:
`cw_storage_plus::Map<'_, u64, Game>: Serialize`
`cw_storage_plus::Map<'_, u64, Game>: DeserializeOwned`
`cw_storage_plus::Map<'_, u64, Game>: Deserialize<'de>`
which is required by `cw_storage_plus::Map<'_, u64, Game>: DeserializeOwned`
From what I can tell the issue is not with the Item or the Map but the Game struct.
I've tried importing DeserializeOwned as in
use serde::de::{DeserializeOwned}
but there is no derive mechanism for it so I can't just add it to the derive.
I read at stackoverflow.com/a/60091762 that
You just have to add
#[derive(serde::Deserialize)]and use theDeserializeOwned.
I feel like I am missing something obvious but I've not been able to work it out.