Exercício de Integração: Arrays, Structs, Mappings e Enums
Faremos um exercício integrador que utilizará arrays, structs, mappings e enums.
Cada endereço (address) terá atribuído um array de structs. Em cada struct é possível armazenar uma string, uma cor e acompanhar o número de vezes que a string foi modificada.
Passos a seguir:
Programe o contrato no Remix,
Faça o deploy do contrato no Remix.
Com um endereço, adicione informações no seu respectivo array para pelo menos duas posições (2 structs). Use a função addInfo para isso.
Faça o mesmo utilizando outro endereço.
Execute as funções setInfo, setColor, getOneInfo, getMyInfoAtIndex e listAllInfo.
Código Solidity
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
/// @title Conceitos: Tudo Junto 3
/// @author Solange Gueiros
// Um array de structs por endereço = mapping, struct e array
// contagem de mudanças por endereço
contract AllTogether {
enum Colors {Undefined, Blue, Red}
struct InfoStruct {
string info;
Colors color;
uint countChanges;
}
mapping(address => InfoStruct[]) public storedInfos;
constructor() {
InfoStruct memory auxInfo = InfoStruct ({
info: "Hello world",
color: Colors.Undefined,
countChanges: 0
});
storedInfos[msg.sender].push(auxInfo);
}
event InfoChange(address person, uint countChanges, string oldInfo, string newInfo);
// Adiciona um struct na última posição do array associado a quem envia a transação
function addInfo(Colors myColor, string memory myInfo) public returns (uint index) {
InfoStruct memory auxInfo = InfoStruct ({
info: myInfo,
color: myColor,
countChanges: 0
});
storedInfos[msg.sender].push(auxInfo);
index = storedInfos[msg.sender].length -1;
}
// Modifica a info dentro do struct em uma posição específica do array
function setInfo(uint index, string memory newInfo) public {
storedInfos[msg.sender][index].countChanges++;
emit InfoChange(msg.sender, storedInfos[msg.sender][index].countChanges, storedInfos[msg.sender][index].info, newInfo);
storedInfos[msg.sender][index].info = newInfo;
}
// Modifica a cor dentro do struct em uma posição específica do array
function setColor(uint index, Colors myColor) public {
storedInfos[msg.sender][index].color = myColor;
storedInfos[msg.sender][index].countChanges++;
}
// Retorna o struct de uma posição específica do array associado a um endereço
function getOneInfo(address account, uint index) public view returns (InfoStruct memory) {
require(index < storedInfos[account].length, "index inválido");
return storedInfos[account][index];
}
// Retorna o struct de uma posição específica do array associado a quem envia a transação
function getMyInfoAtIndex(uint index) external view returns (InfoStruct memory) {
return getOneInfo(msg.sender, index);
}
// Lista o array de structs associado a um endereço
function listAllInfo(address account) external view returns (InfoStruct[] memory) {
return storedInfos[account];
}
}