Просмотр исходного кода

feat(map_lib): support emqx_map_lib:deep_find/2

Shawn 4 лет назад
Родитель
Сommit
0aec496886
1 измененных файлов с 20 добавлено и 15 удалено
  1. 20 15
      apps/emqx/src/emqx_map_lib.erl

+ 20 - 15
apps/emqx/src/emqx_map_lib.erl

@@ -17,6 +17,7 @@
 
 -export([ deep_get/2
         , deep_get/3
+        , deep_find/2
         , deep_put/3
         , safe_atom_key_map/1
         , unsafe_atom_key_map/1
@@ -29,12 +30,28 @@
 %%-----------------------------------------------------------------
 -spec deep_get(config_key_path(), map()) -> term().
 deep_get(ConfKeyPath, Map) ->
-    do_deep_get(ConfKeyPath, Map, fun(KeyPath, Data) ->
-        error({not_found, KeyPath, Data}) end).
+    case deep_find(ConfKeyPath, Map) of
+        {not_found, KeyPath, Data} -> error({not_found, KeyPath, Data});
+        {ok, Data} -> Data
+    end.
 
 -spec deep_get(config_key_path(), map(), term()) -> term().
 deep_get(ConfKeyPath, Map, Default) ->
-    do_deep_get(ConfKeyPath, Map, fun(_, _) -> Default end).
+    case deep_find(ConfKeyPath, Map) of
+        {not_found, _KeyPath, _Data} -> Default;
+        {ok, Data} -> Data
+    end.
+
+-spec deep_find(config_key_path(), map()) -> {ok, term()} | {not_found, config_key(), term()}.
+deep_find([], Map) ->
+    {ok, Map};
+deep_find([Key | KeyPath], Map) when is_map(Map) ->
+    case maps:find(Key, Map) of
+        {ok, SubMap} -> deep_find(KeyPath, SubMap);
+        error -> {not_found, Key, Map}
+    end;
+deep_find([Key | _KeyPath], Data) ->
+    {not_found, Key, Data}.
 
 -spec deep_put(config_key_path(), map(), term()) -> map().
 deep_put([], Map, Config) when is_map(Map) ->
@@ -50,18 +67,6 @@ safe_atom_key_map(Map) ->
     covert_keys_to_atom(Map, fun(K) -> binary_to_existing_atom(K, utf8) end).
 
 %%---------------------------------------------------------------------------
-
--spec do_deep_get(config_key_path(), map(), fun((config_key(), term()) -> any())) -> term().
-do_deep_get([], Map, _) ->
-    Map;
-do_deep_get([Key | KeyPath], Map, OnNotFound) when is_map(Map) ->
-    case maps:find(Key, Map) of
-        {ok, SubMap} -> do_deep_get(KeyPath, SubMap, OnNotFound);
-        error -> OnNotFound(Key, Map)
-    end;
-do_deep_get([Key | _KeyPath], Data, OnNotFound) ->
-    OnNotFound(Key, Data).
-
 covert_keys_to_atom(BinKeyMap, Conv) when is_map(BinKeyMap) ->
     maps:fold(
         fun(K, V, Acc) when is_binary(K) ->