Skip to content

Commit

Permalink
Version 1.0.5 (2024-04-23)
Browse files Browse the repository at this point in the history
  • Loading branch information
potatosalad committed Apr 23, 2024
1 parent 02e0662 commit 5f72041
Show file tree
Hide file tree
Showing 10 changed files with 81 additions and 20 deletions.
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# Changelog

## 1.0.5 (2024-04-23)

* Enhancements
* Add new functions to `argo_index_map`:
* `argo_index_map:filter/2`
* `argo_index_map:filtermap/2`
* `argo_index_map:sort/1`
* `argo_index_map:sort/2`
* Add new functions to `argo_index_set`:
* `argo_index_set:sort/1`
* `argo_index_set:sort/2`
* Fixes
* Unwrap nested `NULLABLE(NULLABLE(...))` and treat a `NON_NULL(DESC(null))` the same as `NULL` (see [msolomon/argo#18](https://github.com/msolomon/argo/issues/18)).
* Implement "Field Selection Merging" from [GraphQL Spec: 5.3.2 Field Selection Merging](https://spec.graphql.org/draft/#sec-Field-Selection-Merging) (see [msolomon/argo#19](https://github.com/msolomon/argo/pull/19)).

## 1.0.4 (2024-04-17)

* Fixes
Expand Down
2 changes: 1 addition & 1 deletion apps/argo/src/argo.app.src
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
%%% % @format
{application, argo, [
{description, "argo: Erlang implementation of Argo for GraphQL"},
{vsn, "1.0.4"},
{vsn, "1.0.5"},
{modules, []},
{registered, []},
%% NOTE: Remember to sync changes to `applications` to
Expand Down
30 changes: 30 additions & 0 deletions apps/argo/src/argo_index_set.erl
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,36 @@ next(none) ->
size(#argo_index_set{map = IndexMap}) ->
argo_index_map:size(IndexMap).

-spec sort(IndexSet1) -> IndexSet2 when
Element :: element(), IndexSet1 :: t(Element), IndexSet2 :: t(Element).
sort(IndexSet1 = #argo_index_set{}) ->
sort(fun sort_fun_default/4, IndexSet1).

%% @private
-spec sort_fun_default(AIndex, AItem, BIndex, BItem) -> boolean() when
AIndex :: index(), AItem :: element(), BIndex :: index(), BItem :: element().
sort_fun_default(_AIndex, AItem, _BIndex, BItem) ->
AItem =< BItem.

-spec sort(SortFun, IndexSet1) -> IndexSet2 when
SortFun :: iterator_order_func(Element),
Element :: element(),
IndexSet1 :: t(Element),
IndexSet2 :: t(Element).
sort(SortFun, IndexSet1 = #argo_index_set{}) when is_function(SortFun, 4) ->
Iterator = iterator(IndexSet1, SortFun),
foldl_iterator(Iterator, fun sort_fun_foldl/3, new()).

%% @private
-spec sort_fun_foldl(Index, Element, IndexSet1) -> IndexSet2 when
Index :: index(),
Element :: element(),
IndexSet1 :: t(Element),
IndexSet2 :: t(Element).
sort_fun_foldl(_Index, Element, IndexSet1 = #argo_index_set{}) ->
IndexSet2 = add_element(Element, IndexSet1),
IndexSet2.

-spec take(Element, IndexSet1) -> {Element, IndexSet2} | error when
Element :: element(), IndexSet1 :: t(Element), IndexSet2 :: t(Element).
take(Element, IndexSet1 = #argo_index_set{}) ->
Expand Down
26 changes: 18 additions & 8 deletions apps/argo/src/argo_typer.erl
Original file line number Diff line number Diff line change
Expand Up @@ -643,7 +643,8 @@ merge_field_wire_type(
#argo_field_wire_type{name = Name, 'of' = Of, omittable = OmittableA},
#argo_field_wire_type{name = Name, 'of' = Of, omittable = OmittableB}
) ->
argo_field_wire_type:new(Name, Of, OmittableA orelse OmittableB);
OmittableC = merge_field_wire_type_omittable(OmittableA, OmittableB),
argo_field_wire_type:new(Name, Of, OmittableC);
merge_field_wire_type(
Path1,
#argo_field_wire_type{
Expand All @@ -656,10 +657,19 @@ merge_field_wire_type(
Path2 = argo_path_value:push_field_name(Path1, Name),
RecordC = merge_record_wire_type(Path2, RecordA, RecordB),
Of = argo_wire_type:record(RecordC),
argo_field_wire_type:new(Name, Of, OmittableA orelse OmittableB);
OmittableC = merge_field_wire_type_omittable(OmittableA, OmittableB),
argo_field_wire_type:new(Name, Of, OmittableC);
merge_field_wire_type(Path, A = #argo_field_wire_type{}, B = #argo_field_wire_type{}) ->
throw({badshape, Path, A, B}).

%% @private
-spec merge_field_wire_type_omittable(OmittableA, OmittableB) -> OmittableC when
OmittableA :: argo_field_wire_type:omittable(),
OmittableB :: argo_field_wire_type:omittable(),
OmittableC :: argo_field_wire_type:omittable().
merge_field_wire_type_omittable(OmittableA, OmittableB) when is_boolean(OmittableA) andalso is_boolean(OmittableB) ->
OmittableA orelse OmittableB.

%% @private
-spec merge_record_wire_type(Path, A, B) -> C when
Path :: argo_path_value:t(),
Expand Down Expand Up @@ -697,9 +707,9 @@ merge_record_wire_type_fields(Path1, FieldsBIterator1, FieldsC1) ->
{ok, _FieldWireTypeC = #argo_field_wire_type{name = Name, 'of' = Of}} ->
merge_record_wire_type_fields(Path1, FieldsBIterator2, FieldsC1);
error ->
FieldsC2 = argo_index_map:put(
Name, FieldWireTypeB#argo_field_wire_type{omittable = true}, FieldsC1
),
OmittableC = true,
FieldWireTypeC = FieldWireTypeB#argo_field_wire_type{omittable = OmittableC},
FieldsC2 = argo_index_map:put(Name, FieldWireTypeC, FieldsC1),
merge_record_wire_type_fields(Path1, FieldsBIterator2, FieldsC2)
end
end.
Expand Down Expand Up @@ -727,9 +737,9 @@ merge_record_wire_type_fields(Path1, FieldsAIterator1, FieldsB, FieldsC1) ->
FieldsC2 = argo_index_map:put(Name, FieldWireTypeC, FieldsC1),
merge_record_wire_type_fields(Path1, FieldsAIterator2, FieldsB, FieldsC2);
error ->
FieldsC2 = argo_index_map:put(
Name, FieldWireTypeA#argo_field_wire_type{omittable = true}, FieldsC1
),
OmittableC = true,
FieldWireTypeC = FieldWireTypeA#argo_field_wire_type{omittable = OmittableC},
FieldsC2 = argo_index_map:put(Name, FieldWireTypeC, FieldsC1),
merge_record_wire_type_fields(Path1, FieldsAIterator2, FieldsB, FieldsC2)
end
end.
Expand Down
2 changes: 1 addition & 1 deletion apps/argo/src/value/argo_json_value_decoder.erl
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,7 @@ decode_record_wire_type(
decode_field_wire_type(
JsonValueDecoder1 = #argo_json_value_decoder{}, FieldWireType = #argo_field_wire_type{name = Name}, JsonObject
) when ?is_json_object(JsonObject) ->
case FieldWireType#argo_field_wire_type.omittable of
case argo_field_wire_type:is_omittable(FieldWireType) of
false ->
case argo_json:object_find(Name, JsonObject) of
{ok, JsonValue} ->
Expand Down
6 changes: 3 additions & 3 deletions apps/argo/src/value/argo_value_decoder.erl
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ decode_record_wire_type(
decode_field_wire_type(
ValueDecoder1 = #argo_value_decoder{message = MessageDecoder1}, FieldWireType = #argo_field_wire_type{}
) ->
case FieldWireType#argo_field_wire_type.omittable of
case argo_field_wire_type:is_omittable(FieldWireType) of
false ->
{ValueDecoder2, Value} = decode_wire_type(ValueDecoder1, FieldWireType#argo_field_wire_type.'of'),
FieldValue = argo_field_value:required(FieldWireType, Value),
Expand Down Expand Up @@ -865,7 +865,7 @@ decode_self_describing_record_wire_type_fields(
{ok, FieldValue} ->
argo_record_value:insert(RecordValueAcc, FieldValue);
error ->
case FieldWireType#argo_field_wire_type.omittable of
case argo_field_wire_type:is_omittable(FieldWireType) of
false ->
error_with_info(badarg, [ValueDecoder1, RecordWireType, 0, Map1], #{
1 => {missing_required_field, FieldName}
Expand Down Expand Up @@ -893,7 +893,7 @@ decode_self_describing_record_wire_type_fields(
{ok, FieldWireType = #argo_field_wire_type{}} ->
ValueDecoder2 = ValueDecoder1#argo_value_decoder{message = MessageDecoder2},
{ValueDecoder3, Value} = decode_wire_type(ValueDecoder2, FieldWireType#argo_field_wire_type.'of'),
case FieldWireType#argo_field_wire_type.omittable of
case argo_field_wire_type:is_omittable(FieldWireType) of
false ->
Map2 = maps:put(FieldName, argo_field_value:required(FieldWireType, Value), Map1),
decode_self_describing_record_wire_type_fields(
Expand Down
9 changes: 7 additions & 2 deletions apps/argo/src/wire/argo_field_wire_type.erl
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,24 @@
]).

%% Types
-type omittable() :: boolean().
-type t() :: #argo_field_wire_type{}.

-export_type([
omittable/0,
t/0
]).

%% Macros
-define(is_omittable(X), (is_boolean(X))).

%%%=============================================================================
%%% API functions
%%%=============================================================================

-spec new(Name, Of, Omittable) -> FieldWireType when
Name :: argo_types:name(), Of :: argo_wire_type:t(), Omittable :: boolean(), FieldWireType :: t().
new(Name, Of = #argo_wire_type{}, Omittable) when is_binary(Name) andalso is_boolean(Omittable) ->
Name :: argo_types:name(), Of :: argo_wire_type:t(), Omittable :: omittable(), FieldWireType :: t().
new(Name, Of = #argo_wire_type{}, Omittable) when is_binary(Name) andalso ?is_omittable(Omittable) ->
#argo_field_wire_type{name = Name, 'of' = Of, omittable = Omittable}.

-compile({inline, [is_labeled/1]}).
Expand Down
7 changes: 4 additions & 3 deletions apps/argo/src/wire/argo_json_wire_type_encoder.erl
Original file line number Diff line number Diff line change
Expand Up @@ -154,9 +154,10 @@ encode_record_wire_type(JsonWireTypeEncoder1 = #argo_json_wire_type_encoder{}, #
%% @private
-spec encode_field_wire_type(JsonWireTypeEncoder, FieldWireType) -> {JsonWireTypeEncoder, JsonValue} when
JsonWireTypeEncoder :: t(), FieldWireType :: argo_field_wire_type:t(), JsonValue :: argo_json:json_value().
encode_field_wire_type(JsonWireTypeEncoder1 = #argo_json_wire_type_encoder{}, #argo_field_wire_type{
name = Name, 'of' = Of, omittable = Omittable
}) ->
encode_field_wire_type(
JsonWireTypeEncoder1 = #argo_json_wire_type_encoder{}, FieldWireType = #argo_field_wire_type{name = Name, 'of' = Of}
) ->
Omittable = argo_field_wire_type:is_omittable(FieldWireType),
{JsonWireTypeEncoder2, JsonOf} = encode_wire_type(JsonWireTypeEncoder1, Of),
{JsonWireTypeEncoder2, {[{<<"name">>, Name}, {<<"of">>, JsonOf}, {<<"omittable">>, Omittable}]}}.

Expand Down
2 changes: 1 addition & 1 deletion apps/argo/src/wire/argo_wire_type_encoder.erl
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ encode_field_wire_type(
WireTypeEncoder2, FieldWireType#argo_field_wire_type.'of'
),
MessageEncoder4 = argo_message_encoder:encode_block_boolean(
MessageEncoder3, FieldWireType#argo_field_wire_type.omittable
MessageEncoder3, argo_field_wire_type:is_omittable(FieldWireType)
),
WireTypeEncoder4 = WireTypeEncoder3#argo_wire_type_encoder{message = MessageEncoder4},
WireTypeEncoder4.
Expand Down
2 changes: 1 addition & 1 deletion apps/argo/src/wire/argo_wire_type_printer.erl
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ print_field_wire_type(Printer1 = #argo_wire_type_printer{}, FieldWireType = #arg
Printer2 = Printer1#argo_wire_type_printer{depth = Printer1#argo_wire_type_printer.depth + 1},
Printer3 = indent(Printer2),
Printer4 =
case FieldWireType#argo_field_wire_type.omittable of
case argo_field_wire_type:is_omittable(FieldWireType) of
false ->
write(Printer3, "~ts: ", [FieldWireType#argo_field_wire_type.name]);
true ->
Expand Down

0 comments on commit 5f72041

Please sign in to comment.