require 'bundler/setup'
Bundler.require(:development)

require 'yaoc'

include Yaoc::Helper

User = StructHE(:id, :firstname, :lastname, :role)

OldUser = StructHE(:id, :fullname, :r_role)

mapper = Yaoc::ObjectMapper.new(User, OldUser).tap do |mapper|
  mapper.add_mapping do
    fetcher :public_send
    rule to: :role, from: :r_role

    rule to: :firstname,
         from: :fullname,
         converter: ->(source, result) { Yaoc::TransformationCommand.fill_result_with_value(result, :firstname, source.fullname.split.first) },
         reverse_converter: ->(source, result) { Yaoc::TransformationCommand.fill_result_with_value(result, :fullname,  "#{source.firstname} #{source.lastname}") }

    rule to: :lastname,
         from: :fullname,
         converter: ->(source, result) { Yaoc::TransformationCommand.fill_result_with_value(result, :lastname, source.fullname.split.last) },
         reverse_converter: ->(source, result) { result }

    rule to: :id
  end
end

old_user = OldUser.new(id: 1, fullname: 'myfirst mysecond', r_role: 'admin')
new_user = mapper.load(old_user)

puts "\n" * 5

puts old_user
puts new_user

new_user.firstname = 'no'
new_user.lastname = 'name'

puts mapper.dump(new_user)

puts "\n" * 5