summaryrefslogtreecommitdiff
path: root/src/mango/src/mango_fields.erl
blob: 2732560256264ceab50be3ab597b5f5fb7ff1e45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
% http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.

-module(mango_fields).

-export([
    new/1,
    extract/2
]).


-include("mango.hrl").


new([]) ->
    {ok, all_fields};
new(Fields) when is_list(Fields) ->
    {ok, [field(F) || F <- Fields]};
new(Else) ->
    ?MANGO_ERROR({invalid_fields_json, Else}).


extract(Doc, undefined) ->
    Doc;
extract(Doc, all_fields) ->
    Doc;
extract(Doc, Fields) ->
    lists:foldl(fun(F, NewDoc) ->
        {ok, Path} = mango_util:parse_field(F),
        case mango_doc:get_field(Doc, Path) of
            not_found ->
                NewDoc;
            bad_path ->
                NewDoc;
            Value ->
                mango_doc:set_field(NewDoc, Path, Value)
        end
    end, {[]}, Fields).


field(Val) when is_binary(Val) ->
    Val;
field({Val}) when is_list(Val) ->
    {Val};
field(Else) ->
    ?MANGO_ERROR({invalid_field_json, Else}).