Карта соответствия шаблонов с точным списком ключей - PullRequest
0 голосов
/ 05 июня 2018

Чтобы проверить некоторые документы JSON, я должен убедиться, что мой JSON (представленный имеет карту) имеет определенный набор полей не больше, не меньше.

Насколько я знаю, сопоставление с образцомс чем-то вроде #{a := FieldA} = MyJSON только гарантирует, что ключ a присутствует в MyJSON.К сожалению, maps:with/2 игнорирует пропущенные ключи, и большинство других функций карт одновременно работают с одной клавишей.

В этом случае, какой рекомендуемый способ гарантировать, что карта содержит определенное поле или список полей ине какой-нибудь другой?

Мое текущее, уродливое, решение состоит в том, чтобы сопоставить все необходимые мне ключи и перестроить новую карту, как в:

validate(#{a := A, b := B, c := C}) ->
#{a => A, b => B, c => C}.

Но это становится очень трудно поддерживать,очень быстро.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

если я хорошо понимаю вашу проблему, этот код должен делать то, что вы хотите:

is_map_valid(Map,SortedKeyList) ->
    SortedKeyList == lists:sort(maps:keys(Map)).

протестировано в оболочке:

1> Is_map_valid = fun(Map,SortedKeyList) -> SortedKeyList == lists:sort(maps:keys(Map)) end.
#Fun<erl_eval.12.99386804>
2> Map1 = #{a => 1, b => 2}.                                                                
#{a => 1,b => 2}
3> Map2 = #{a => 1, b => 2, c => 3}.
#{a => 1,b => 2,c => 3}
4> Map3 = #{a => 1, b => 2, c => 3, d => 4}.
#{a => 1,b => 2,c => 3,d => 4}
5> Keys = [a,b,c].
[a,b,c]
6> Is_map_valid(Map1,Keys).
false
7> Is_map_valid(Map2,Keys).
true
8> Is_map_valid(Map3,Keys).
false
9>
0 голосов
/ 05 июня 2018

Если я правильно понимаю: используйте maps:size (или erlang:map_size, если вам это нужно в состоянии охраны) после maps:with, то есть что-то вроде

validate(Keys, Map) -> 
    ExpectedSize = erlang:length(Keys),
    case maps:with(Keys, Map) of
        Map1 when erlang:map_size(Map1) == ExpectedSize -> {ok, Map1};
        _ -> invalid
    end.

Вы также можете проверить Mapразмер первый быстро провалится.

...