Last active
November 12, 2022 15:00
-
-
Save mudgen/6b994cbc9c166778684ea897c76779db to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.8.17; | |
library LibPerson { | |
uint256 private constant INNER_STRUCT = 0; | |
struct Car { | |
string brand; | |
string model; | |
} | |
struct PersonDetails { | |
string name; | |
uint256 age; | |
} | |
struct Person { | |
// extendable inner struct | |
mapping(uint256 => PersonDetails) details; | |
// array of cars implemented as a mapping | |
mapping(uint256 => Car) cars; | |
uint256 carLength; | |
} | |
struct Storage { | |
uint256 personsCount; | |
mapping(uint256 => Person) persons; | |
} | |
bytes32 private constant STORAGE_SLOT = keccak256("LibPerson.V2"); | |
function _storage() private pure returns (Storage storage s) { | |
bytes32 slot = STORAGE_SLOT; | |
assembly { | |
s.slot := slot | |
} | |
} | |
function getPersonsCount() internal view returns(uint256 personsCount) { | |
personsCount = _storage().personsCount; | |
} | |
struct PersonInfo { | |
PersonDetails details; | |
Car[] cars; | |
} | |
function getPerson(uint256 id) internal view returns(PersonInfo memory person) { | |
Person storage storagePerson = _storage().persons[id]; | |
person.details = storagePerson.details[INNER_STRUCT]; | |
person.cars = new Car[](storagePerson.carLength); | |
for(uint i; i < person.cars.length; i++) { | |
person.cars[i] = storagePerson.cars[i]; | |
} | |
} | |
function addPerson(PersonInfo memory person) internal returns(uint256 id) { | |
id = ++_storage().personsCount; | |
Person storage storagePerson = _storage().persons[id]; | |
storagePerson.details[INNER_STRUCT] = person.details; | |
for(uint i; i < person.cars.length; i++) { | |
storagePerson.cars[i] = person.cars[i]; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment