Asignar múltiples estructuras a una estructura y llamarlas

Tengo una pregunta sobre cómo debo diseñar mi contrato para lograr lo siguiente: Quiero crear identificadores de productos (pueden ser estructuras o cadenas) algo así como: "producto #123abc". Luego quiero asignarle una estructura (en mi caso, esta estructura contiene información de ubicación) Ejemplo:

struct Location {
    string city;
    string street;
    uint time;}

Y finalmente, quiero asignar varias estructuras de ubicación diferentes a mi producto para poder llamarlo así:

function viewLocation(uint _productID, uint _location) public returns(struct){
    return Product[_productID].Location[_location].city;
}

¿También sería posible simplemente llamar al ID del producto y mostrarme todas las ubicaciones asignadas? Algo como esto:

function viewLocation(uint _productID) public returns(array){
    return Product[_productID].Location;
}

Si no funciona como lo pienso, ¿cómo sería una solución alternativa? Espero que puedas ayudarme :)

Respuestas (1)

Es posible hacer algo como esto:

struct Location {
    string city;
    string street;
    uint time;
}

struct Product {
    uint id;
    string name;
    mapping (uint => Location) locations;
}

mapping (uint => Product) products;

Entonces las implementaciones serán como:

function viewLocation(uint _productID, uint _location) public returns(struct memory Location){
    return products[_productID].locations[_location];
}

Desafortunadamente, las asignaciones simples no se pueden iterar. Pero es posible combinar en una estructura más compleja que se puede iterar, consulte esto para obtener detalles y una implementación https://ethereum.stackexchange.com/a/13168 .

Otra alternativa es mantener separados los lugares y productos. Y mantenga una matriz de ID de ubicación:

struct Product {
    uint id;
    string name;
    uint[] locations;
}

mapping (uint => Product) products;

mapping (uint => Location) locations;

La viewLocation será más compleja:

function viewLocation(uint _productID, uint _location) public returns(struct memory Location){
    // Check if _location is in return products[_productID]
    // Return locations[_location] if it is present
    // Fail otherwise
}