pr fun for nested records.
Project: http://git-wip-us.apache.org/repos/asf/couchdb-lager/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb-lager/commit/4c7e77e8 Tree: http://git-wip-us.apache.org/repos/asf/couchdb-lager/tree/4c7e77e8 Diff: http://git-wip-us.apache.org/repos/asf/couchdb-lager/diff/4c7e77e8 Branch: refs/heads/import-master Commit: 4c7e77e8f1974a7ab9bd7aee50aad008e57ace9f Parents: 773e443 Author: Maxim Minin <maxim@mir-desktop.(none)> Authored: Mon Sep 2 19:13:59 2013 +0200 Committer: Maxim Minin <maxim@mir-desktop.(none)> Committed: Mon Sep 2 19:13:59 2013 +0200 ---------------------------------------------------------------------- src/lager.erl | 57 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb-lager/blob/4c7e77e8/src/lager.erl ---------------------------------------------------------------------- diff --git a/src/lager.erl b/src/lager.erl index 298a9a8..bd4757e 100644 --- a/src/lager.erl +++ b/src/lager.erl @@ -362,30 +362,45 @@ safe_format_chop(Fmt, Args, Limit) -> %% @doc Print a record lager found during parse transform pr(Record, Module) when is_tuple(Record), is_atom(element(1, Record)) -> - try Module:module_info(attributes) of - Attrs -> - case lists:keyfind(lager_records, 1, Attrs) of - false -> - Record; - {lager_records, Records} -> - RecordName = element(1, Record), - RecordSize = tuple_size(Record) - 1, - case lists:filter(fun({Name, Fields}) when Name == RecordName, - length(Fields) == RecordSize -> - true; - (_) -> - false - end, Records) of - [] -> - Record; - [{RecordName, RecordFields}|_] -> - {'$lager_record', RecordName, - lists:zip(RecordFields, tl(tuple_to_list(Record)))} - end - end + try + case is_record_known(Record, Module) of + false -> + Record; + {RecordName, RecordFields} -> + {'$lager_record', RecordName, + zip(RecordFields, tl(tuple_to_list(Record)), Module, [])} + end catch error:undef -> Record end; pr(Record, _) -> Record. + +zip([FieldName|RecordFields], [FieldValue|Record], Module, ToReturn) -> + case is_tuple(FieldValue) andalso is_atom(element(1, FieldValue)) + andalso is_record_known(FieldValue, Module) of + false -> + zip(RecordFields, Record, Module, [{FieldName, FieldValue}|ToReturn]); + _Else -> + F = {FieldName, pr(FieldValue, Module)}, + zip(RecordFields, Record, Module, [F|ToReturn]) + end; +zip([], [], _Module, ToReturn) -> + lists:reverse(ToReturn). + +is_record_known(Record, Module) -> + Name = element(1, Record), + Attrs = Module:module_info(attributes), + case lists:keyfind(lager_records, 1, Attrs) of + false -> false; + {lager_records, Records} -> + case lists:keyfind(Name, 1, Records) of + false -> false; + {Name, RecordFields} -> + case (tuple_size(Record) - 1) =:= length(RecordFields) of + false -> false; + true -> {Name, RecordFields} + end + end + end.
