Skip to content

Commit 2668811

Browse files
authored
Merge pull request #75 from esl/type_improvements
Type improvements
2 parents f4d0755 + 9123113 commit 2668811

File tree

6 files changed

+24
-28
lines changed

6 files changed

+24
-28
lines changed

c_src/exml.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -583,9 +583,10 @@ static ERL_NIF_TERM parse_next(ErlNifEnv *env, int argc,
583583
}
584584

585585
if (error_msg) {
586-
return enif_make_tuple2(
587-
env, atom_error,
588-
enif_make_string(env, error_msg, ERL_NIF_LATIN1));
586+
ERL_NIF_TERM error_message =
587+
to_subbinary(ctx, (const unsigned char *)error_msg, strlen(error_msg));
588+
589+
return enif_make_tuple2(env, atom_error, error_message);
589590
}
590591

591592
return enif_make_tuple3(
@@ -608,9 +609,12 @@ static ERL_NIF_TERM parse(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
608609
return enif_make_tuple2(env, atom_ok, element);
609610
}
610611

611-
return enif_make_tuple2(
612-
env, atom_error,
613-
enif_make_string(env, result.error_message.c_str(), ERL_NIF_LATIN1));
612+
ERL_NIF_TERM error_message =
613+
to_subbinary(ctx,
614+
(const unsigned char *)result.error_message.c_str(),
615+
result.error_message.size());
616+
617+
return enif_make_tuple2(env, atom_error, error_message);
614618
}
615619

616620
static ERL_NIF_TERM escape_cdata(ErlNifEnv *env, int argc,

include/exml.hrl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
-record(xmlel, {name :: binary(),
1313
attrs = #{} :: exml:attrs(),
14-
children = [] :: [exml:element() | exml:cdata()]}).
14+
children = [] :: [exml:child()]}).
1515

1616
%% Implementation of the exmlAssertEqual/2 macro is a modification of
1717
%% https://github.com/erszcz/rxml/commit/e8483408663f0bc2af7896e786c1cdea2e86e43d#diff-2cb5d18741df32f4ead70c21fdd221d1

src/exml.erl

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,12 @@
2828
remove_attr/2,
2929
xml_sort/1]).
3030

31-
-export_type([attr/0,
32-
attrs/0,
31+
-export_type([attrs/0,
3332
cdata/0,
3433
element/0,
34+
child/0,
3535
item/0]).
3636

37-
-type attr() :: {binary(), binary()}.
3837
-type attrs() :: #{binary() => binary()}.
3938
-type cdata() :: #xmlcdata{}.
4039
%% CDATA record. Printing escaping rules defaults to escaping character-wise.
@@ -45,7 +44,8 @@
4544
%% <li>`cdata': wraps the entire string into a `<![CDATA[]]>' section.</li>
4645
%% </ul>
4746
-type element() :: #xmlel{}.
48-
-type item() :: element() | attr() | cdata() | exml_stream:start() | exml_stream:stop().
47+
-type item() :: element() | cdata() | exml_stream:start() | exml_stream:stop().
48+
-type child() :: element() | cdata().
4949
-type prettify() :: pretty | not_pretty.
5050
%% Printing indentation rule, see `to_iolist/2'.
5151

@@ -87,7 +87,6 @@ xml_size({Key, Value}) when is_binary(Key) ->
8787
%% https://github.com/erszcz/rxml/commit/e8483408663f0bc2af7896e786c1cdea2e86e43d
8888
-spec xml_sort([item()]) -> [item()];
8989
(element()) -> element();
90-
(attr()) -> attr();
9190
(cdata()) -> cdata();
9291
(exml_stream:start()) -> exml_stream:start();
9392
(exml_stream:stop()) -> exml_stream:stop().
@@ -101,8 +100,6 @@ xml_sort(#xmlstreamstart{} = StreamStart) ->
101100
StreamStart;
102101
xml_sort(#xmlstreamend{} = StreamEnd) ->
103102
StreamEnd;
104-
xml_sort({Key, Value}) ->
105-
{Key, Value};
106103
xml_sort(Elements) when is_list(Elements) ->
107104
lists:sort([ xml_sort(E) || E <- Elements ]).
108105

src/exml_stream.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
%% `#xmlstreamend{}' record.
3232
-type parser() :: #parser{}.
3333
%% `#parser{}' record. Keeps track of unparsed buffers.
34-
-type element() :: exml:element() | exml_stream:start() | exml_stream:stop().
34+
-type element() :: exml:element() | start() | stop().
3535
%% One of `t:exml:element/0', `t:start/0', or `t:stop/0'.
3636

3737
-type parser_opt() :: {infinite_stream, boolean()} | {max_element_size, non_neg_integer()}.
@@ -69,7 +69,7 @@ new_parser(Opts)->
6969
%%
7070
%% If successful, returns parsed elements and a new parser with updated buffers.
7171
-spec parse(parser(), binary()) ->
72-
{ok, parser(), [exml_stream:element()]} | {error, Reason :: any()}.
72+
{ok, parser(), [element()]} | {error, Reason :: binary()}.
7373
parse(Parser, Input) when is_binary(Input) ->
7474
#parser{event_parser = EventParser, buffer = OldBuf} = Parser,
7575
Buffer = OldBuf ++ [Input],

test/exml_stream_tests.erl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,45 +188,45 @@ stream_max_opening_tag_size_test() ->
188188
?assertMatch({ok, _Parser1, [#xmlstreamstart{},
189189
#xmlel{}]}, exml_stream:parse(Parser0, <<"<stream89><a></a>">>)),
190190
{ok, Parser2} = exml_stream:new_parser([{max_element_size, 9}]),
191-
?assertEqual({error, "element too big"}, exml_stream:parse(Parser2, <<"<stream89><a></a>">>)).
191+
?assertEqual({error, <<"element too big">>}, exml_stream:parse(Parser2, <<"<stream89><a></a>">>)).
192192

193193
stream_max_element_size_test() ->
194194
{ok, Parser0} = exml_stream:new_parser([{max_element_size, 10}]),
195195
{ok, Parser1, Elements0} = exml_stream:parse(Parser0, <<"<stream><a></a>">>),
196196
?assertMatch([#xmlstreamstart{}, #xmlel{}], Elements0),
197-
?assertEqual({error, "element too big"}, exml_stream:parse(Parser1, <<"<c><d/></c>">>)).
197+
?assertEqual({error, <<"element too big">>}, exml_stream:parse(Parser1, <<"<c><d/></c>">>)).
198198

199199
stream_max_text_element_size_test() ->
200200
{ok, Parser0} = exml_stream:new_parser([{max_element_size, 10}]),
201201
{ok, Parser1, Elements0} = exml_stream:parse(Parser0, <<"<stream><a>123</a><b>123</b>">>),
202202
?assertMatch([#xmlstreamstart{}, #xmlel{}, #xmlel{}], Elements0),
203-
?assertEqual({error, "element too big"}, exml_stream:parse(Parser1, <<"<c>1234</c>">>)).
203+
?assertEqual({error, <<"element too big">>}, exml_stream:parse(Parser1, <<"<c>1234</c>">>)).
204204

205205
stream_max_incomplete_element_size_test() ->
206206
{ok, Parser0} = exml_stream:new_parser([{max_element_size, 10}]),
207207
{ok, Parser1, Elements0} = exml_stream:parse(Parser0, <<"<stream><a>123</a><b>123</b>">>),
208208
?assertMatch([#xmlstreamstart{}, #xmlel{}, #xmlel{}], Elements0),
209209
%% Element <c> has 10 characters, but it's incomplete, so it would be too big
210-
?assertEqual({error, "element too big"}, exml_stream:parse(Parser1, <<"<c>1234</c">>)).
210+
?assertEqual({error, <<"element too big">>}, exml_stream:parse(Parser1, <<"<c>1234</c">>)).
211211

212212
stream_max_chunked_element_size_test() ->
213213
{ok, Parser0} = exml_stream:new_parser([{max_element_size, 10}]),
214214
{ok, Parser1, Elements0} = exml_stream:parse(Parser0, <<"<stream><a><b/>">>),
215215
?assertMatch([#xmlstreamstart{}], Elements0),
216-
?assertEqual({error, "element too big"}, exml_stream:parse(Parser1, <<" ">>)).
216+
?assertEqual({error, <<"element too big">>}, exml_stream:parse(Parser1, <<" ">>)).
217217

218218
stream_max_root_element_size_test() ->
219219
{ok, Parser0} = exml_stream:new_parser([{max_element_size, 10}, {infinite_stream, true}]),
220220
{ok, Parser1, Elements0} = exml_stream:parse(Parser0, <<"<a>123</a><b>123</b>">>),
221221
?assertMatch([#xmlel{}, #xmlel{}], Elements0),
222-
?assertEqual({error, "element too big"}, exml_stream:parse(Parser1, <<"<c><d/></c>">>)).
222+
?assertEqual({error, <<"element too big">>}, exml_stream:parse(Parser1, <<"<c><d/></c>">>)).
223223

224224
stream_max_incomplete_root_element_size_test() ->
225225
{ok, Parser0} = exml_stream:new_parser([{max_element_size, 10}, {infinite_stream, true}]),
226226
{ok, Parser1, Elements0} = exml_stream:parse(Parser0, <<"<a>123</a><b>123</b>">>),
227227
?assertMatch([#xmlel{}, #xmlel{}], Elements0),
228228
%% Element <c> has 10 characters, but it will have at least one more character
229-
?assertEqual({error, "element too big"}, exml_stream:parse(Parser1, <<"<c>1234</c">>)).
229+
?assertEqual({error, <<"element too big">>}, exml_stream:parse(Parser1, <<"<c>1234</c">>)).
230230

231231
infinite_stream_partial_chunk_test() ->
232232
{ok, Parser0} = exml_stream:new_parser([{infinite_stream, true}]),

test/exml_tests.erl

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,6 @@ sort_xmlel_identity_test() ->
5252
},
5353
?assertEqual(El, exml:xml_sort(El)).
5454

55-
sort_xmlel_attributes_test() ->
56-
Attrs = [{<<"attr1">>, <<"foo">>}, {<<"attr2">>, <<"bar">>}],
57-
ToOrder = [{<<"attr2">>, <<"bar">>}, {<<"attr1">>, <<"foo">>}],
58-
?assertEqual(Attrs, exml:xml_sort(ToOrder)).
59-
6055
remove_cdata_test() ->
6156
Attrs = #{<<"attr1">> => <<"foo">>, <<"attr2">> => <<"bar">>},
6257
Child1 = #xmlel{name = <<"el1">>, attrs = Attrs},

0 commit comments

Comments
 (0)