#include <eosiolib/eosio.hpp>
class [[eosio::contract("addressbook")]] addressbook : public eosio::contract {
struct [[eosio::table]] person {
uint64_t primary_key() const {return key.value;}
typedef eosio::multi_index<"person"_n, person> address_index;
using contract::contract;
addressbook(name receiver, name code, datastream<const char*> ds): contract(receiver, code, ds) {}
void upsert(name user, std::string first_name, std::string last_name, std::string street,std::string city, std::string state) {
address_index addresses(_self, _self.value);
auto iterator = addresses.find(user.value);
if( iterator == addresses.end() )
addresses.emplace(user, [&]( auto& row ) {
row.first_name = first_name;
row.last_name = last_name;
addresses.modify(iterator, user, [&]( auto& row ) {
row.first_name = first_name;
row.last_name = last_name;
address_index addresses(_self, _self.value);
auto iterator = addresses.find(user.value);
eosio_assert(iterator != addresses.end(), "Record does not exist");
addresses.erase(iterator);
EOSIO_DISPATCH( addressbook, (upsert)(erase))