<div>
                    Hi,
                </div><div><br></div><div>We have built a number of projects recently that have a mongodb backend, an HTML / javascript frontend and Erlang in the middle - pretty standard stuff.  One of the things the we end up repeating over and over is mapping data from BSON (the mongo format) to Records (our preferred in-memory format for Erlang) and JSON (to send / receive from the browser).  To add to the mix, we also like using proplists in configuration files, so have mappings from those to records as well.</div><div><br></div><div>On the last project I finally got sick of doing it by hand, so knocked up a fairly simple parse transform to take the records (with their type specifications) and generate the mapping code, which has resulted in being able to do things like (note - pseudocode only!):</div><div><br></div><div><font face="Courier New">Foo = build_my_record(),</font></div><div><font face="Courier New">mongo:insert(collection, mapper:record_to_bson(Foo)),</font></div><div><font face="Courier New">web_socket:send(Client, mapper:record_to_json(Foo)),</font></div><div><font face="Courier New"><br></font></div><div><font face="Courier New">receive</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">   </span>{client, Response} -></font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">               </span>do_stuff_with(mapper:json_to_record(foo, Response)</font></div><div><font face="Courier New">end</font></div><div><br></div><div>This has worked very well, and handles about 80% of the types we throw at it.  The sorts of types that it doesn't deal with are unions and tuples, e.g.</div><div><br></div><div><font face="Courier New">-record(bla, {</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">     </span>metadata :: x() | y(),</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre"> </span>ratio :: {integer(), integer()}</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">        </span>}). </font></div><div> </div><div>Due to the value the simple version has had to us, I'm about to embark on a re-work that is going to aim to handle (pretty much) any type you can throw at it, and give full two-directional fidelity on the conversions (e.g., you can assert that <font face="Courier New">Data == xxx_to_record(record_to_xxx(Data))</font> ).  </div><div><br></div><div>So, a couple of questions:</div><div><br></div><div>1. Does such a thing already exist?  I'm no fan of re-inventing the wheel :)</div><div>2. If not, would anyone be interested in it being open-sourced?</div><div>3. If 2., then does anyone have opinions on the functionality / API etc?</div><div><br></div><div>Interested in any feedback,</div><div><br></div><div>Cheers,</div><div><br></div><div>Steve</div><div><div>-- </div><div>Steve Strong</div><div>Sent with <a href="http://www.sparrowmailapp.com/?sig">Sparrow</a></div><div><br></div><div><br></div></div>