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.

Reply via email to