Вступление: модуль получает данные в виде списка
Input = [{c,CValue},{a,AValue},{b,BValue}]
Задача — распихать данные по записи #rec, в соответствии с описанием записи. В случае, если бы в erlang работа с записями осуществлялась в рантайме, функция была бы примерно такой:
-record(rec, {a,b,c}).<br/>
<br/>
build_rec_dynamic(Input) -><br/>
Fields = record_info(fields, rec),<br/>
build_payload(Input, Fields, #rec{}).<br/>
<br/>
build_rec_dynamic(Input, [Field|Fields], Result) -><br/>
case lists:keyfind(Field, 1, Input) of<br/>
{Field, Value} -><br/>
build_payload(Input, Fields, Result#rec{Field = Value});<br/>
false -><br/>
{error, {undefined_field, Field}}<br/>
end;<br/>
<br/>
build_rec_dynamic(Input, [], Result) -><br/>
Result.
Из-за особенностей работы с записями такой фокус, конечно, не пройдет:
field 'Field' is not an atom or _ in record rec
Есть ли какой-нибудь общий паттерн для обработки динамических данных и представления их в записи? Сразу отмечу, что данные могут приходить в неверном порядке, поэтому просто спихнуть все в кортеж не пойдет, да и вытаскивать нужно только необходимые поля.