Skip to content

Instantly share code, notes, and snippets.

@mudgen
Last active November 12, 2022 15:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mudgen/6b994cbc9c166778684ea897c76779db to your computer and use it in GitHub Desktop.
Save mudgen/6b994cbc9c166778684ea897c76779db to your computer and use it in GitHub Desktop.
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