From 539e3a64dbf83f7678ecf90e0c6bb9202cdc458e Mon Sep 17 00:00:00 2001 From: Elisabet Salazar <40662951+elisa6@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:08:07 -0500 Subject: [PATCH 01/13] Add function to generate an enum type (#1) * Modify the enum type generated * Generate enum types by files Co-authored-by: Juan Esteban Nieto Cifuentes --- lib/xdrgen/generators/elixir.rb | 108 +++++++++-- .../block_comments.x/MyXDR_generated.ex | 12 +- .../block_comments.x/account_flags.ex | 57 ++++++ .../const.x/MyXDR_generated.ex | 19 +- .../enum.x/MyXDR_generated.ex | 45 +---- .../generator_spec_elixir/enum.x/color.ex | 59 ++++++ .../generator_spec_elixir/enum.x/color2.ex | 59 ++++++ .../enum.x/message_type.ex | 70 +++++++ .../nesting.x/MyXDR_generated.ex | 52 ++---- .../nesting.x/union_key.ex | 59 ++++++ .../optional.x/MyXDR_generated.ex | 20 +- .../struct.x/MyXDR_generated.ex | 24 +-- .../test.x/MyXDR_generated.ex | 173 +++++++----------- .../generator_spec_elixir/test.x/color.ex | 59 ++++++ .../test.x/nested_enum.ex | 58 ++++++ .../union.x/MyXDR_generated.ex | 58 +++--- .../union.x/union_key.ex | 58 ++++++ 17 files changed, 719 insertions(+), 271 deletions(-) create mode 100644 spec/output/generator_spec_elixir/block_comments.x/account_flags.ex create mode 100644 spec/output/generator_spec_elixir/enum.x/color.ex create mode 100644 spec/output/generator_spec_elixir/enum.x/color2.ex create mode 100644 spec/output/generator_spec_elixir/enum.x/message_type.ex create mode 100644 spec/output/generator_spec_elixir/nesting.x/union_key.ex create mode 100644 spec/output/generator_spec_elixir/test.x/color.ex create mode 100644 spec/output/generator_spec_elixir/test.x/nested_enum.ex create mode 100644 spec/output/generator_spec_elixir/union.x/union_key.ex diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index b19d7cdfe..3b1f22b9c 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -2,6 +2,7 @@ module Xdrgen module Generators class Elixir < Xdrgen::Generators::Base MAX_INT = (2**31) - 1 + def generate path = "#{@namespace}_generated.ex" out = @output.open(path) @@ -32,7 +33,7 @@ def render_definition(out, defn) when AST::Definitions::Struct ; render_struct out, defn when AST::Definitions::Enum ; - render_enum out, defn + render_enum defn when AST::Definitions::Union ; render_union out, defn when AST::Definitions::Typedef ; @@ -49,36 +50,47 @@ def render_source_comment(out, defn) out.puts <<-EOS.strip_heredoc comment ~S""" - === xdr source ============================================================ - + XDR Source Code::\n EOS out.puts " " + defn.text_value.split("\n").join("\n ") out.puts <<-EOS.strip_heredoc + """\n + EOS + end + + def render_moduledoc(out) + out.puts <<-EOS.strip_heredoc + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten - =========================================================================== + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr """ EOS + out.break end - def render_moduledoc(out) + def render_moduledoc_enum_type(out, type) out.puts <<-EOS.strip_heredoc @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten - Target implementation: exdr at https://hex.pm/packages/exdr + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `#{type.upcase_first}` type. """ EOS out.break + out.puts "@behaviour XDR.Declaration\n\n" end def render_define_block(out) out.puts "defmodule #{@namespace} do" out.indent do render_moduledoc(out) - out.puts "use XDR.Base\n\n" end yield ensure @@ -86,6 +98,16 @@ def render_define_block(out) out.break end + def render_define_block_enum_type(out, module_name) + out.puts "defmodule #{@namespace}.#{module_name.upcase_first} do" + out.indent do + render_moduledoc_enum_type(out, module_name) + end + yield + ensure + out.puts "end" + out.break + end def render_typedef(out, typedef) out.puts "define_type(\"#{name typedef}\", #{build_type_args typedef.declaration.type})" @@ -105,14 +127,72 @@ def render_struct(out, struct) out.puts ")" end - def render_enum(out, enum) - out.puts "define_type(\"#{name enum}\", Enum," - out.indent do - enum.members.each_with_index do |m, i| - out.puts "#{member_name m}: #{m.value}#{comma_unless_last(i, enum.members)}" + def render_enum(enum) + file_name = "#{enum.name.underscore.downcase}.ex" + out = @output.open(file_name) + + render_define_block_enum_type(out, enum.name) do + out.indent do + out.puts "@declarations [\n" + out.indent do + enum.members.each_with_index do |m, i| + out.puts "#{m.name}: #{m.value}#{comma_unless_last(i, enum.members)}" + end + end + out.puts "]\n\n" + + out.puts "@enum_spec %XDR.Enum{declarations: @declarations, identifier: nil}\n\n" + + out.puts "@type t :: %__MODULE__{identifier: atom()}\n\n" + + out.puts "defstruct [:identifier]\n\n" + + out.puts "@spec new(type :: atom()) :: t()\n" + out.puts "def new(type \\\\ :#{enum.members.first.name}), do: %__MODULE__{identifier: type}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{identifier: type}) do\n" + out.indent do + out.puts "@declarations\n" + out.puts "|> XDR.Enum.new(type)\n" + out.puts "|> XDR.Enum.encode_xdr()\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{identifier: type}) do\n" + out.indent do + out.puts "@declarations\n" + out.puts "|> XDR.Enum.new(type)\n" + out.puts "|> XDR.Enum.encode_xdr!()\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, spec \\\\ @enum_spec)\n\n" + + out.puts "def decode_xdr(bytes, spec) do\n" + out.indent do + out.puts "case XDR.Enum.decode_xdr(bytes, spec) do\n" + out.indent do + out.puts "{:ok, {%XDR.Enum{identifier: type}, rest}} -> {:ok, {new(type), rest}}\n" + out.puts "error -> error\n" + end + out.puts "end\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, spec \\\\ @enum_spec)\n\n" + + out.puts "def decode_xdr!(bytes, spec) do\n" + out.indent do + out.puts "{%XDR.Enum{identifier: type}, rest} = XDR.Enum.decode_xdr!(bytes, spec)\n" + out.puts "{new(type), rest}\n" + end + out.puts "end\n" end end - out.puts ")" end def render_union(out, union) @@ -176,7 +256,7 @@ def const_name(named) end def member_name(member) - name(member).underscore + name(member).underscore.upcase end # this can be a string to reference a custom type diff --git a/spec/output/generator_spec_elixir/block_comments.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/block_comments.x/MyXDR_generated.ex index 41d118c6b..74b1ed54b 100644 --- a/spec/output/generator_spec_elixir/block_comments.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/block_comments.x/MyXDR_generated.ex @@ -3,23 +3,17 @@ defmodule MyXDR do Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten - Target implementation: exdr at https://hex.pm/packages/exdr + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr """ - use XDR.Base - comment ~S""" - === xdr source ============================================================ + XDR Source Code:: enum AccountFlags { // masks for each flag AUTH_REQUIRED_FLAG = 0x1 }; - - =========================================================================== """ - define_type("AccountFlags", Enum, - auth_required_flag: 1 - ) + end diff --git a/spec/output/generator_spec_elixir/block_comments.x/account_flags.ex b/spec/output/generator_spec_elixir/block_comments.x/account_flags.ex new file mode 100644 index 000000000..497bc342d --- /dev/null +++ b/spec/output/generator_spec_elixir/block_comments.x/account_flags.ex @@ -0,0 +1,57 @@ +defmodule MyXDR.AccountFlags do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `AccountFlags` type. + """ + + @behaviour XDR.Declaration + + @declarations [ + AUTH_REQUIRED_FLAG: 1 + ] + + @enum_spec %XDR.Enum{declarations: @declarations, identifier: nil} + + @type t :: %__MODULE__{identifier: atom()} + + defstruct [:identifier] + + @spec new(type :: atom()) :: t() + def new(type \\ :AUTH_REQUIRED_FLAG), do: %__MODULE__{identifier: type} + + @impl true + def encode_xdr(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @enum_spec) + + def decode_xdr(bytes, spec) do + case XDR.Enum.decode_xdr(bytes, spec) do + {:ok, {%XDR.Enum{identifier: type}, rest}} -> {:ok, {new(type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @enum_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.Enum{identifier: type}, rest} = XDR.Enum.decode_xdr!(bytes, spec) + {new(type), rest} + end +end diff --git a/spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex index 191b6b68a..0ec181268 100644 --- a/spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex @@ -3,36 +3,31 @@ defmodule MyXDR do Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten - Target implementation: exdr at https://hex.pm/packages/exdr + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr """ - use XDR.Base - comment ~S""" - === xdr source ============================================================ + XDR Source Code:: const FOO = 1; - - =========================================================================== """ + define_type("FOO", Const, 1); comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef int TestArray[FOO]; - - =========================================================================== """ + define_type("TestArray", Array, length: "FOO", type: buid_type(base_ref)) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef int TestArray2; - - =========================================================================== """ + define_type("TestArray2", VariableArray, max_length: "FOO", type: buid_type(base_ref)) end diff --git a/spec/output/generator_spec_elixir/enum.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/enum.x/MyXDR_generated.ex index 85a9b236b..fa3f1c52b 100644 --- a/spec/output/generator_spec_elixir/enum.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/enum.x/MyXDR_generated.ex @@ -3,13 +3,11 @@ defmodule MyXDR do Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten - Target implementation: exdr at https://hex.pm/packages/exdr + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr """ - use XDR.Base - comment ~S""" - === xdr source ============================================================ + XDR Source Code:: enum MessageType { @@ -34,58 +32,29 @@ defmodule MyXDR do FBA_QUORUMSET, FBA_MESSAGE }; - - =========================================================================== """ - define_type("MessageType", Enum, - error_msg: 0, - hello: 1, - dont_have: 2, - get_peers: 3, - peers: 4, - get_tx_set: 5, - tx_set: 6, - get_validations: 7, - validations: 8, - transaction: 9, - json_transaction: 10, - get_fba_quorumset: 11, - fba_quorumset: 12, - fba_message: 13 - ) + comment ~S""" - === xdr source ============================================================ + XDR Source Code:: enum Color { RED=0, GREEN=1, BLUE=2 }; - - =========================================================================== """ - define_type("Color", Enum, - red: 0, - green: 1, - blue: 2 - ) + comment ~S""" - === xdr source ============================================================ + XDR Source Code:: enum Color2 { RED2=RED, GREEN2=1, BLUE2=2 }; - - =========================================================================== """ - define_type("Color2", Enum, - red2: 0, - green2: 1, - blue2: 2 - ) + end diff --git a/spec/output/generator_spec_elixir/enum.x/color.ex b/spec/output/generator_spec_elixir/enum.x/color.ex new file mode 100644 index 000000000..b35e175e1 --- /dev/null +++ b/spec/output/generator_spec_elixir/enum.x/color.ex @@ -0,0 +1,59 @@ +defmodule MyXDR.Color do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Color` type. + """ + + @behaviour XDR.Declaration + + @declarations [ + RED: 0, + GREEN: 1, + BLUE: 2 + ] + + @enum_spec %XDR.Enum{declarations: @declarations, identifier: nil} + + @type t :: %__MODULE__{identifier: atom()} + + defstruct [:identifier] + + @spec new(type :: atom()) :: t() + def new(type \\ :RED), do: %__MODULE__{identifier: type} + + @impl true + def encode_xdr(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @enum_spec) + + def decode_xdr(bytes, spec) do + case XDR.Enum.decode_xdr(bytes, spec) do + {:ok, {%XDR.Enum{identifier: type}, rest}} -> {:ok, {new(type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @enum_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.Enum{identifier: type}, rest} = XDR.Enum.decode_xdr!(bytes, spec) + {new(type), rest} + end +end diff --git a/spec/output/generator_spec_elixir/enum.x/color2.ex b/spec/output/generator_spec_elixir/enum.x/color2.ex new file mode 100644 index 000000000..fbd0dd685 --- /dev/null +++ b/spec/output/generator_spec_elixir/enum.x/color2.ex @@ -0,0 +1,59 @@ +defmodule MyXDR.Color2 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Color2` type. + """ + + @behaviour XDR.Declaration + + @declarations [ + RED2: 0, + GREEN2: 1, + BLUE2: 2 + ] + + @enum_spec %XDR.Enum{declarations: @declarations, identifier: nil} + + @type t :: %__MODULE__{identifier: atom()} + + defstruct [:identifier] + + @spec new(type :: atom()) :: t() + def new(type \\ :RED2), do: %__MODULE__{identifier: type} + + @impl true + def encode_xdr(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @enum_spec) + + def decode_xdr(bytes, spec) do + case XDR.Enum.decode_xdr(bytes, spec) do + {:ok, {%XDR.Enum{identifier: type}, rest}} -> {:ok, {new(type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @enum_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.Enum{identifier: type}, rest} = XDR.Enum.decode_xdr!(bytes, spec) + {new(type), rest} + end +end diff --git a/spec/output/generator_spec_elixir/enum.x/message_type.ex b/spec/output/generator_spec_elixir/enum.x/message_type.ex new file mode 100644 index 000000000..5b7f126e3 --- /dev/null +++ b/spec/output/generator_spec_elixir/enum.x/message_type.ex @@ -0,0 +1,70 @@ +defmodule MyXDR.MessageType do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `MessageType` type. + """ + + @behaviour XDR.Declaration + + @declarations [ + ERROR_MSG: 0, + HELLO: 1, + DONT_HAVE: 2, + GET_PEERS: 3, + PEERS: 4, + GET_TX_SET: 5, + TX_SET: 6, + GET_VALIDATIONS: 7, + VALIDATIONS: 8, + TRANSACTION: 9, + JSON_TRANSACTION: 10, + GET_FBA_QUORUMSET: 11, + FBA_QUORUMSET: 12, + FBA_MESSAGE: 13 + ] + + @enum_spec %XDR.Enum{declarations: @declarations, identifier: nil} + + @type t :: %__MODULE__{identifier: atom()} + + defstruct [:identifier] + + @spec new(type :: atom()) :: t() + def new(type \\ :ERROR_MSG), do: %__MODULE__{identifier: type} + + @impl true + def encode_xdr(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @enum_spec) + + def decode_xdr(bytes, spec) do + case XDR.Enum.decode_xdr(bytes, spec) do + {:ok, {%XDR.Enum{identifier: type}, rest}} -> {:ok, {new(type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @enum_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.Enum{identifier: type}, rest} = XDR.Enum.decode_xdr!(bytes, spec) + {new(type), rest} + end +end diff --git a/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex index 665fd7dfa..c3d5c57ac 100644 --- a/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex @@ -3,67 +3,56 @@ defmodule MyXDR do Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten - Target implementation: exdr at https://hex.pm/packages/exdr + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr """ - use XDR.Base - comment ~S""" - === xdr source ============================================================ + XDR Source Code:: enum UnionKey { ONE = 1, TWO = 2, OFFER = 3 }; - - =========================================================================== """ - define_type("UnionKey", Enum, - one: 1, - two: 2, - offer: 3 - ) + comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef int Foo; - - =========================================================================== """ + define_type("Foo", Int) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: struct { int someInt; } - - =========================================================================== """ + define_type("MyUnionOne", Struct, - some_int: build_type(Int) + SOME_INT: build_type(Int) ) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: struct { int someInt; Foo foo; } - - =========================================================================== """ + define_type("MyUnionTwo", Struct, - some_int: build_type(Int), - foo: "Foo" + SOME_INT: build_type(Int), + FOO: "Foo" ) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: union MyUnion switch (UnionKey type) { @@ -81,20 +70,19 @@ defmodule MyXDR do case OFFER: void; }; - - =========================================================================== """ + define_type("MyUnion", Union, switch_type: "UnionKey", - switch_name: :type, + switch_name: :TYPE, switches: [ - {:one, :one}, - {:two, :two}, - {:offer, XDR.Type.Void}, + {:ONE, :ONE}, + {:TWO, :TWO}, + {:OFFER, XDR.Type.Void}, ], arms: [ - one: "MyUnionOne", - two: "MyUnionTwo", + ONE: "MyUnionOne", + TWO: "MyUnionTwo", ] ) diff --git a/spec/output/generator_spec_elixir/nesting.x/union_key.ex b/spec/output/generator_spec_elixir/nesting.x/union_key.ex new file mode 100644 index 000000000..14e5bfdba --- /dev/null +++ b/spec/output/generator_spec_elixir/nesting.x/union_key.ex @@ -0,0 +1,59 @@ +defmodule MyXDR.UnionKey do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `UnionKey` type. + """ + + @behaviour XDR.Declaration + + @declarations [ + ONE: 1, + TWO: 2, + OFFER: 3 + ] + + @enum_spec %XDR.Enum{declarations: @declarations, identifier: nil} + + @type t :: %__MODULE__{identifier: atom()} + + defstruct [:identifier] + + @spec new(type :: atom()) :: t() + def new(type \\ :ONE), do: %__MODULE__{identifier: type} + + @impl true + def encode_xdr(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @enum_spec) + + def decode_xdr(bytes, spec) do + case XDR.Enum.decode_xdr(bytes, spec) do + {:ok, {%XDR.Enum{identifier: type}, rest}} -> {:ok, {new(type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @enum_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.Enum{identifier: type}, rest} = XDR.Enum.decode_xdr!(bytes, spec) + {new(type), rest} + end +end diff --git a/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex index 9b1531ec9..030052705 100644 --- a/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex @@ -3,22 +3,19 @@ defmodule MyXDR do Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten - Target implementation: exdr at https://hex.pm/packages/exdr + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr """ - use XDR.Base - comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef int Arr[2]; - - =========================================================================== """ + define_type("Arr", Array, length: 2, type: buid_type(base_ref)) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: struct HasOptions { @@ -26,13 +23,12 @@ defmodule MyXDR do int *secondOption; Arr *thirdOption; }; - - =========================================================================== """ + define_type("HasOptions", Struct, - first_option: build_type(Optional, buid_type(base_ref)), - second_option: build_type(Optional, buid_type(base_ref)), - third_option: build_type(Optional, "Arr") + FIRST_OPTION: build_type(Optional, buid_type(base_ref)), + SECOND_OPTION: build_type(Optional, buid_type(base_ref)), + THIRD_OPTION: build_type(Optional, "Arr") ) end diff --git a/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex index 6c859516e..55e980c6f 100644 --- a/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex @@ -3,22 +3,19 @@ defmodule MyXDR do Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten - Target implementation: exdr at https://hex.pm/packages/exdr + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr """ - use XDR.Base - comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef hyper int64; - - =========================================================================== """ + define_type("Int64", HyperInt) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: struct MyStruct { @@ -28,15 +25,14 @@ defmodule MyXDR do string someString<>; string maxString<100>; }; - - =========================================================================== """ + define_type("MyStruct", Struct, - some_int: build_type(Int), - a_big_int: "Int64", - some_opaque: build_type(Opaque, 10), - some_string: build_type(XDR.Type.String, ), - max_string: build_type(XDR.Type.String, 100) + SOME_INT: build_type(Int), + A_BIG_INT: "Int64", + SOME_OPAQUE: build_type(Opaque, 10), + SOME_STRING: build_type(XDR.Type.String, ), + MAX_STRING: build_type(XDR.Type.String, 100) ) end diff --git a/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex index 4f6d2eb55..e70c6d514 100644 --- a/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex @@ -3,149 +3,131 @@ defmodule MyXDR do Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten - Target implementation: exdr at https://hex.pm/packages/exdr + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr """ - use XDR.Base - - comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef opaque uint512[64]; - - =========================================================================== """ + define_type("Uint512", Opaque, 64) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef opaque uint513<64>; - - =========================================================================== """ + define_type("Uint513", VariableOpaque, 64) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef opaque uint514<>; - - =========================================================================== """ + define_type("Uint514", VariableOpaque) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef string str<64>; - - =========================================================================== """ + define_type("Str", XDR.Type.String, 64) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef string str2<>; - - =========================================================================== """ + define_type("Str2", XDR.Type.String, ) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef opaque Hash[32]; - - =========================================================================== """ + define_type("Hash", Opaque, 32) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef Hash Hashes1[12]; - - =========================================================================== """ + define_type("Hashes1", Array, length: 12, type: "Hash") comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef Hash Hashes2<12>; - - =========================================================================== """ + define_type("Hashes2", VariableArray, max_length: 12, type: "Hash") comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef Hash Hashes3<>; - - =========================================================================== """ + define_type("Hashes3", VariableArray, max_length: 2147483647, type: "Hash") comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef Hash *optHash1; - - =========================================================================== """ + define_type("OptHash1", Optional, "Hash") comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef Hash* optHash2; - - =========================================================================== """ + define_type("OptHash2", Optional, "Hash") comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef int int1; - - =========================================================================== """ + define_type("Int1", Int) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef hyper int2; - - =========================================================================== """ + define_type("Int2", HyperInt) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef unsigned int int3; - - =========================================================================== """ + define_type("Int3", UnsignedInt) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef unsigned hyper int4; - - =========================================================================== """ + define_type("Int4", UnsignedHyperInt) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: struct MyStruct { @@ -157,112 +139,95 @@ defmodule MyXDR do double field6; bool field7; }; - - =========================================================================== """ + define_type("MyStruct", Struct, - field1: "Uint512", - field2: "OptHash1", - field3: "Int1", - field4: build_type(UnsignedInt), - field5: build_type(Float), - field6: build_type(Double), - field7: build_type(Bool) + FIELD1: "Uint512", + FIELD2: "OptHash1", + FIELD3: "Int1", + FIELD4: build_type(UnsignedInt), + FIELD5: build_type(Float), + FIELD6: build_type(Double), + FIELD7: build_type(Bool) ) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: struct LotsOfMyStructs { MyStruct members<>; }; - - =========================================================================== """ + define_type("LotsOfMyStructs", Struct, - members: build_type(VariableArray, max_length: 2147483647, type: "MyStruct") + MEMBERS: build_type(VariableArray, max_length: 2147483647, type: "MyStruct") ) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: struct HasStuff { LotsOfMyStructs data; }; - - =========================================================================== """ + define_type("HasStuff", Struct, - data: "LotsOfMyStructs" + DATA: "LotsOfMyStructs" ) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: enum Color { RED, BLUE = 5, GREEN }; - - =========================================================================== """ - define_type("Color", Enum, - red: 0, - blue: 5, - green: 6 - ) + comment ~S""" - === xdr source ============================================================ + XDR Source Code:: const FOO = 1244; - - =========================================================================== """ + define_type("FOO", Const, 1244); comment ~S""" - === xdr source ============================================================ + XDR Source Code:: const BAR = FOO; - - =========================================================================== """ + define_type("BAR", Const, FOO); comment ~S""" - === xdr source ============================================================ + XDR Source Code:: enum { BLAH_1, BLAH_2 } - - =========================================================================== """ - define_type("NesterNestedEnum", Enum, - blah1: 0, - blah2: 1 - ) + comment ~S""" - === xdr source ============================================================ + XDR Source Code:: struct { int blah; } - - =========================================================================== """ + define_type("NesterNestedStruct", Struct, - blah: build_type(Int) + BLAH: build_type(Int) ) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: union switch (Color color) { case RED: @@ -270,23 +235,22 @@ defmodule MyXDR do default: int blah2; } - - =========================================================================== """ + define_type("NesterNestedUnion", Union, switch_type: "Color", - switch_name: :color, + switch_name: :COLOR, switches: [ - {:red, XDR.Type.Void}, + {:RED, XDR.Type.Void}, ], arms: [ - blah2: build_type(Int), + BLAH2: build_type(Int), ], - default_arm: blah2, + default_arm: BLAH2, ) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: struct Nester { @@ -308,13 +272,12 @@ defmodule MyXDR do }; - - =========================================================================== """ + define_type("Nester", Struct, - nested_enum: "NesterNestedEnum", - nested_struct: "NesterNestedStruct", - nested_union: "NesterNestedUnion" + NESTED_ENUM: "NesterNestedEnum", + NESTED_STRUCT: "NesterNestedStruct", + NESTED_UNION: "NesterNestedUnion" ) end diff --git a/spec/output/generator_spec_elixir/test.x/color.ex b/spec/output/generator_spec_elixir/test.x/color.ex new file mode 100644 index 000000000..80c0795df --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/color.ex @@ -0,0 +1,59 @@ +defmodule MyXDR.Color do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Color` type. + """ + + @behaviour XDR.Declaration + + @declarations [ + RED: 0, + BLUE: 5, + GREEN: 6 + ] + + @enum_spec %XDR.Enum{declarations: @declarations, identifier: nil} + + @type t :: %__MODULE__{identifier: atom()} + + defstruct [:identifier] + + @spec new(type :: atom()) :: t() + def new(type \\ :RED), do: %__MODULE__{identifier: type} + + @impl true + def encode_xdr(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @enum_spec) + + def decode_xdr(bytes, spec) do + case XDR.Enum.decode_xdr(bytes, spec) do + {:ok, {%XDR.Enum{identifier: type}, rest}} -> {:ok, {new(type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @enum_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.Enum{identifier: type}, rest} = XDR.Enum.decode_xdr!(bytes, spec) + {new(type), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/nested_enum.ex b/spec/output/generator_spec_elixir/test.x/nested_enum.ex new file mode 100644 index 000000000..ee8c5570f --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/nested_enum.ex @@ -0,0 +1,58 @@ +defmodule MyXDR.NestedEnum do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `NestedEnum` type. + """ + + @behaviour XDR.Declaration + + @declarations [ + BLAH_1: 0, + BLAH_2: 1 + ] + + @enum_spec %XDR.Enum{declarations: @declarations, identifier: nil} + + @type t :: %__MODULE__{identifier: atom()} + + defstruct [:identifier] + + @spec new(type :: atom()) :: t() + def new(type \\ :BLAH_1), do: %__MODULE__{identifier: type} + + @impl true + def encode_xdr(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @enum_spec) + + def decode_xdr(bytes, spec) do + case XDR.Enum.decode_xdr(bytes, spec) do + {:ok, {%XDR.Enum{identifier: type}, rest}} -> {:ok, {new(type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @enum_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.Enum{identifier: type}, rest} = XDR.Enum.decode_xdr!(bytes, spec) + {new(type), rest} + end +end diff --git a/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex index ddcb67713..e0487b2ac 100644 --- a/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex @@ -3,46 +3,37 @@ defmodule MyXDR do Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten - Target implementation: exdr at https://hex.pm/packages/exdr + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr """ - use XDR.Base - comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef int Error; - - =========================================================================== """ + define_type("Error", Int) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef int Multi; - - =========================================================================== """ + define_type("Multi", Int) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: enum UnionKey { ERROR, MULTI }; - - =========================================================================== """ - define_type("UnionKey", Enum, - error: 0, - multi: 1 - ) + comment ~S""" - === xdr source ============================================================ + XDR Source Code:: union MyUnion switch (UnionKey type) { @@ -53,24 +44,23 @@ defmodule MyXDR do }; - - =========================================================================== """ + define_type("MyUnion", Union, switch_type: "UnionKey", - switch_name: :type, + switch_name: :TYPE, switches: [ - {:error, :error}, - {:multi, :things}, + {:ERROR, :ERROR}, + {:MULTI, :THINGS}, ], arms: [ - error: "Error", - things: build_type(VariableArray, max_length: 2147483647, type: "Multi"), + ERROR: "Error", + THINGS: build_type(VariableArray, max_length: 2147483647, type: "Multi"), ] ) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: union IntUnion switch (int type) { @@ -80,29 +70,27 @@ defmodule MyXDR do Multi things<>; }; - - =========================================================================== """ + define_type("IntUnion", Union, switch_type: build_type(Int), - switch_name: :type, + switch_name: :TYPE, switches: [ - {0, :error}, - {1, :things}, + {0, :ERROR}, + {1, :THINGS}, ], arms: [ - error: "Error", - things: build_type(VariableArray, max_length: 2147483647, type: "Multi"), + ERROR: "Error", + THINGS: build_type(VariableArray, max_length: 2147483647, type: "Multi"), ] ) comment ~S""" - === xdr source ============================================================ + XDR Source Code:: typedef IntUnion IntUnion2; - - =========================================================================== """ + define_type("IntUnion2", "IntUnion") end diff --git a/spec/output/generator_spec_elixir/union.x/union_key.ex b/spec/output/generator_spec_elixir/union.x/union_key.ex new file mode 100644 index 000000000..279ab4842 --- /dev/null +++ b/spec/output/generator_spec_elixir/union.x/union_key.ex @@ -0,0 +1,58 @@ +defmodule MyXDR.UnionKey do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `UnionKey` type. + """ + + @behaviour XDR.Declaration + + @declarations [ + ERROR: 0, + MULTI: 1 + ] + + @enum_spec %XDR.Enum{declarations: @declarations, identifier: nil} + + @type t :: %__MODULE__{identifier: atom()} + + defstruct [:identifier] + + @spec new(type :: atom()) :: t() + def new(type \\ :ERROR), do: %__MODULE__{identifier: type} + + @impl true + def encode_xdr(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{identifier: type}) do + @declarations + |> XDR.Enum.new(type) + |> XDR.Enum.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @enum_spec) + + def decode_xdr(bytes, spec) do + case XDR.Enum.decode_xdr(bytes, spec) do + {:ok, {%XDR.Enum{identifier: type}, rest}} -> {:ok, {new(type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @enum_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.Enum{identifier: type}, rest} = XDR.Enum.decode_xdr!(bytes, spec) + {new(type), rest} + end +end From 332d36a2764de365fa7353ad05f9a8a8409e80a7 Mon Sep 17 00:00:00 2001 From: Elisabet Salazar <40662951+elisa6@users.noreply.github.com> Date: Fri, 28 Apr 2023 12:23:05 -0500 Subject: [PATCH 02/13] Add a function to generate a union type (#2) * Add union type * Resolve comments --- lib/xdrgen/generators/elixir.rb | 131 +++++++++++++----- .../nesting.x/MyXDR_generated.ex | 15 +- .../nesting.x/my_union.ex | 75 ++++++++++ .../optional.x/MyXDR_generated.ex | 2 +- .../struct.x/MyXDR_generated.ex | 2 +- .../test.x/MyXDR_generated.ex | 37 ++--- .../test.x/nested_union.ex | 69 +++++++++ .../union.x/MyXDR_generated.ex | 26 +--- .../union.x/int_union.ex | 73 ++++++++++ .../generator_spec_elixir/union.x/my_union.ex | 73 ++++++++++ 10 files changed, 407 insertions(+), 96 deletions(-) create mode 100644 spec/output/generator_spec_elixir/nesting.x/my_union.ex create mode 100644 spec/output/generator_spec_elixir/test.x/nested_union.ex create mode 100644 spec/output/generator_spec_elixir/union.x/int_union.ex create mode 100644 spec/output/generator_spec_elixir/union.x/my_union.ex diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index 3b1f22b9c..97d4dfc75 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -196,45 +196,114 @@ def render_enum(enum) end def render_union(out, union) - out.puts "define_type(\"#{name union}\", Union," - out.indent do - out.puts "switch_type: #{type_reference union.discriminant.type}," - out.puts "switch_name: :#{member_name union.discriminant}," + file_name = "#{union.name.underscore.downcase}.ex" + out = @output.open(file_name) - out.puts "switches: [" + render_define_block_enum_type(out, union.name) do out.indent do - union.normal_arms.each do |arm| - arm_name = arm.void? ? "XDR.Type.Void" : ":#{member_name(arm)}" + out.puts "alias #{@namespace}.{\n" + out.indent do + out.puts "#{type_reference union.discriminant.type}," + union.normal_arms.each_with_index do |arm, i| + arm_name = arm.void? ? "Void" : "#{type_reference arm.type}" + + arm.cases.each do |acase| + out.puts "#{arm_name}#{comma_unless_last(i, union.normal_arms)}" + end + end + end + out.puts "}\n\n" - arm.cases.each do |acase| - switch = if acase.value.is_a?(AST::Identifier) - ":#{member_name(acase.value)}" + out.puts "@arms [" + out.indent do + union.normal_arms.each_with_index do |arm, i| + arm_name = arm.void? ? "Void" : "#{type_reference arm.type}" + + arm.cases.each do |acase| + switch = if acase.value.is_a?(AST::Identifier) + "#{member_name(acase.value)}" + else + acase.value.text_value + end + + out.puts "#{switch}: #{arm_name}#{comma_unless_last(i, union.normal_arms)}" + end + end + end + out.puts "]\n\n" + + out.puts "@type value ::" + out.indent(4) do + union.normal_arms.each_with_index do |arm, i| + next if arm.void? + if i == 0 + out.puts "#{type_reference arm.type}.t()" else - acase.value.text_value + out.puts "| #{type_reference arm.type}.t()" end + end + end + out.puts "\n" + + out.puts "@type t :: %__MODULE__{value: value(), type: #{type_reference union.discriminant.type}.t()}\n\n" + + out.puts "defstruct [:value, :type]\n\n" + + out.puts "@spec new(value :: value(), type :: #{type_reference union.discriminant.type}.t()) :: t()\n" + out.puts "def new(value, %#{type_reference union.discriminant.type}{} = type), do: %__MODULE__{value: value, type: type}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{value: value, type: type}) do\n" + out.indent do + out.puts "type\n" + out.puts "|> XDR.Union.new(@arms, value)\n" + out.puts "|> XDR.Union.encode_xdr()\n" + end + out.puts "end\n\n" - out.puts "{#{switch}, #{arm_name}}," + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{value: value, type: type}) do\n" + out.indent do + out.puts "type\n" + out.puts "|> XDR.Union.new(@arms, value)\n" + out.puts "|> XDR.Union.encode_xdr!()\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, spec \\\\ union_spec())\n\n" + + out.puts "def decode_xdr(bytes, spec) do\n" + out.indent do + out.puts "case XDR.Union.decode_xdr(bytes, spec) do\n" + out.indent do + out.puts "{:ok, {{type, value}, rest}} -> {:ok, {new(value, type), rest}}\n" + out.puts "error -> error\n" end + out.puts "end\n" end - end - out.puts "]," + out.puts "end\n\n" - out.puts "arms: [" - out.indent do - union.arms.each do |arm| - next if arm.void? - out.puts "#{member_name arm}: #{type_reference arm.type}," + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, spec \\\\ union_spec())\n\n" + + out.puts "def decode_xdr!(bytes, spec) do\n" + out.indent do + out.puts "{{type, value}, rest} = XDR.Union.decode_xdr!(bytes, spec)\n" + out.puts "{new(value, type), rest}\n" end - end - out.puts union.default_arm.present? ? "]," : "]" + out.puts "end\n\n" - if union.default_arm.present? - arm = union.default_arm - arm_name = arm.void? ? "XDR.Type.Void" : member_name(arm) - out.puts "default_arm: #{arm_name}," + out.puts "@spec union_spec() :: XDR.Union.t()" + out.puts "defp union_spec do" + out.indent do + out.puts "nil\n" + out.puts "|> #{type_reference union.discriminant.type}.new()\n" + out.puts "|> XDR.Union.new(@arms)\n" + end + out.puts "end\n" end end - out.puts ")" end private @@ -265,7 +334,7 @@ def member_name(member) def type_reference(type) build_args = build_type_args(type) - build_args === "\"#{name type}\"" ? build_args : "build_type(#{build_args})" + build_args === "#{name type}" ? build_args : "build_type(#{build_args})" end def comma_unless_last(index, collection) @@ -304,16 +373,16 @@ def build_type_args(type) when AST::Typespecs::UnsignedInt "UnsignedInt" when AST::Typespecs::Simple - "\"#{name type}\"" + "#{name type}" when AST::Definitions::Base - "\"#{name type}\"" + "#{name type}" when AST::Concerns::NestedDefinition - "\"#{name type}\"" + "#{name type}" else raise "Unknown reference type: #{type.class.name}, #{type.class.ancestors}" end - base_type = base_ref === "\"#{name type}\"" ? base_ref : "buid_type(base_ref)" + base_type = base_ref === "#{name type}" ? base_ref : "buid_type(base_ref)" case type.sub_type when :simple diff --git a/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex index c3d5c57ac..8ba9977ba 100644 --- a/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex @@ -48,7 +48,7 @@ defmodule MyXDR do define_type("MyUnionTwo", Struct, SOME_INT: build_type(Int), - FOO: "Foo" + FOO: Foo ) comment ~S""" @@ -72,18 +72,5 @@ defmodule MyXDR do }; """ - define_type("MyUnion", Union, - switch_type: "UnionKey", - switch_name: :TYPE, - switches: [ - {:ONE, :ONE}, - {:TWO, :TWO}, - {:OFFER, XDR.Type.Void}, - ], - arms: [ - ONE: "MyUnionOne", - TWO: "MyUnionTwo", - ] - ) end diff --git a/spec/output/generator_spec_elixir/nesting.x/my_union.ex b/spec/output/generator_spec_elixir/nesting.x/my_union.ex new file mode 100644 index 000000000..4613ba1f9 --- /dev/null +++ b/spec/output/generator_spec_elixir/nesting.x/my_union.ex @@ -0,0 +1,75 @@ +defmodule MyXDR.MyUnion do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `MyUnion` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{ + UnionKey, + MyUnionOne, + MyUnionTwo, + Void + } + + @arms [ + ONE: MyUnionOne, + TWO: MyUnionTwo, + OFFER: Void + ] + + @type value :: + MyUnionOne.t() + | MyUnionTwo.t() + + @type t :: %__MODULE__{value: value(), type: UnionKey.t()} + + defstruct [:value, :type] + + @spec new(value :: value(), type :: UnionKey.t()) :: t() + def new(value, %UnionKey{} = type), do: %__MODULE__{value: value, type: type} + + @impl true + def encode_xdr(%__MODULE__{value: value, type: type}) do + type + |> XDR.Union.new(@arms, value) + |> XDR.Union.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value, type: type}) do + type + |> XDR.Union.new(@arms, value) + |> XDR.Union.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ union_spec()) + + def decode_xdr(bytes, spec) do + case XDR.Union.decode_xdr(bytes, spec) do + {:ok, {{type, value}, rest}} -> {:ok, {new(value, type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ union_spec()) + + def decode_xdr!(bytes, spec) do + {{type, value}, rest} = XDR.Union.decode_xdr!(bytes, spec) + {new(value, type), rest} + end + + @spec union_spec() :: XDR.Union.t() + defp union_spec do + nil + |> UnionKey.new() + |> XDR.Union.new(@arms) + end +end diff --git a/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex index 030052705..54395c37a 100644 --- a/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex @@ -28,7 +28,7 @@ defmodule MyXDR do define_type("HasOptions", Struct, FIRST_OPTION: build_type(Optional, buid_type(base_ref)), SECOND_OPTION: build_type(Optional, buid_type(base_ref)), - THIRD_OPTION: build_type(Optional, "Arr") + THIRD_OPTION: build_type(Optional, Arr) ) end diff --git a/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex index 55e980c6f..9f0c05481 100644 --- a/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex @@ -29,7 +29,7 @@ defmodule MyXDR do define_type("MyStruct", Struct, SOME_INT: build_type(Int), - A_BIG_INT: "Int64", + A_BIG_INT: Int64, SOME_OPAQUE: build_type(Opaque, 10), SOME_STRING: build_type(XDR.Type.String, ), MAX_STRING: build_type(XDR.Type.String, 100) diff --git a/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex index e70c6d514..1900e13ef 100644 --- a/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex @@ -60,7 +60,7 @@ defmodule MyXDR do typedef Hash Hashes1[12]; """ - define_type("Hashes1", Array, length: 12, type: "Hash") + define_type("Hashes1", Array, length: 12, type: Hash) comment ~S""" XDR Source Code:: @@ -68,7 +68,7 @@ defmodule MyXDR do typedef Hash Hashes2<12>; """ - define_type("Hashes2", VariableArray, max_length: 12, type: "Hash") + define_type("Hashes2", VariableArray, max_length: 12, type: Hash) comment ~S""" XDR Source Code:: @@ -76,7 +76,7 @@ defmodule MyXDR do typedef Hash Hashes3<>; """ - define_type("Hashes3", VariableArray, max_length: 2147483647, type: "Hash") + define_type("Hashes3", VariableArray, max_length: 2147483647, type: Hash) comment ~S""" XDR Source Code:: @@ -84,7 +84,7 @@ defmodule MyXDR do typedef Hash *optHash1; """ - define_type("OptHash1", Optional, "Hash") + define_type("OptHash1", Optional, Hash) comment ~S""" XDR Source Code:: @@ -92,7 +92,7 @@ defmodule MyXDR do typedef Hash* optHash2; """ - define_type("OptHash2", Optional, "Hash") + define_type("OptHash2", Optional, Hash) comment ~S""" XDR Source Code:: @@ -142,9 +142,9 @@ defmodule MyXDR do """ define_type("MyStruct", Struct, - FIELD1: "Uint512", - FIELD2: "OptHash1", - FIELD3: "Int1", + FIELD1: Uint512, + FIELD2: OptHash1, + FIELD3: Int1, FIELD4: build_type(UnsignedInt), FIELD5: build_type(Float), FIELD6: build_type(Double), @@ -161,7 +161,7 @@ defmodule MyXDR do """ define_type("LotsOfMyStructs", Struct, - MEMBERS: build_type(VariableArray, max_length: 2147483647, type: "MyStruct") + MEMBERS: build_type(VariableArray, max_length: 2147483647, type: MyStruct) ) comment ~S""" @@ -174,7 +174,7 @@ defmodule MyXDR do """ define_type("HasStuff", Struct, - DATA: "LotsOfMyStructs" + DATA: LotsOfMyStructs ) comment ~S""" @@ -237,17 +237,6 @@ defmodule MyXDR do } """ - define_type("NesterNestedUnion", Union, - switch_type: "Color", - switch_name: :COLOR, - switches: [ - {:RED, XDR.Type.Void}, - ], - arms: [ - BLAH2: build_type(Int), - ], - default_arm: BLAH2, - ) comment ~S""" XDR Source Code:: @@ -275,9 +264,9 @@ defmodule MyXDR do """ define_type("Nester", Struct, - NESTED_ENUM: "NesterNestedEnum", - NESTED_STRUCT: "NesterNestedStruct", - NESTED_UNION: "NesterNestedUnion" + NESTED_ENUM: NesterNestedEnum, + NESTED_STRUCT: NesterNestedStruct, + NESTED_UNION: NesterNestedUnion ) end diff --git a/spec/output/generator_spec_elixir/test.x/nested_union.ex b/spec/output/generator_spec_elixir/test.x/nested_union.ex new file mode 100644 index 000000000..9f6c53314 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/nested_union.ex @@ -0,0 +1,69 @@ +defmodule MyXDR.NestedUnion do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `NestedUnion` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{ + Color, + Void + } + + @arms [ + RED: Void + ] + + @type value :: + + @type t :: %__MODULE__{value: value(), type: Color.t()} + + defstruct [:value, :type] + + @spec new(value :: value(), type :: Color.t()) :: t() + def new(value, %Color{} = type), do: %__MODULE__{value: value, type: type} + + @impl true + def encode_xdr(%__MODULE__{value: value, type: type}) do + type + |> XDR.Union.new(@arms, value) + |> XDR.Union.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value, type: type}) do + type + |> XDR.Union.new(@arms, value) + |> XDR.Union.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ union_spec()) + + def decode_xdr(bytes, spec) do + case XDR.Union.decode_xdr(bytes, spec) do + {:ok, {{type, value}, rest}} -> {:ok, {new(value, type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ union_spec()) + + def decode_xdr!(bytes, spec) do + {{type, value}, rest} = XDR.Union.decode_xdr!(bytes, spec) + {new(value, type), rest} + end + + @spec union_spec() :: XDR.Union.t() + defp union_spec do + nil + |> Color.new() + |> XDR.Union.new(@arms) + end +end diff --git a/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex index e0487b2ac..e920b842a 100644 --- a/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex @@ -46,18 +46,6 @@ defmodule MyXDR do }; """ - define_type("MyUnion", Union, - switch_type: "UnionKey", - switch_name: :TYPE, - switches: [ - {:ERROR, :ERROR}, - {:MULTI, :THINGS}, - ], - arms: [ - ERROR: "Error", - THINGS: build_type(VariableArray, max_length: 2147483647, type: "Multi"), - ] - ) comment ~S""" XDR Source Code:: @@ -72,18 +60,6 @@ defmodule MyXDR do }; """ - define_type("IntUnion", Union, - switch_type: build_type(Int), - switch_name: :TYPE, - switches: [ - {0, :ERROR}, - {1, :THINGS}, - ], - arms: [ - ERROR: "Error", - THINGS: build_type(VariableArray, max_length: 2147483647, type: "Multi"), - ] - ) comment ~S""" XDR Source Code:: @@ -91,6 +67,6 @@ defmodule MyXDR do typedef IntUnion IntUnion2; """ - define_type("IntUnion2", "IntUnion") + define_type("IntUnion2", IntUnion) end diff --git a/spec/output/generator_spec_elixir/union.x/int_union.ex b/spec/output/generator_spec_elixir/union.x/int_union.ex new file mode 100644 index 000000000..1449876af --- /dev/null +++ b/spec/output/generator_spec_elixir/union.x/int_union.ex @@ -0,0 +1,73 @@ +defmodule MyXDR.IntUnion do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `IntUnion` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{ + build_type(Int), + Error, + build_type(VariableArray, max_length: 2147483647, type: Multi) + } + + @arms [ + 0: Error, + 1: build_type(VariableArray, max_length: 2147483647, type: Multi) + ] + + @type value :: + Error.t() + | build_type(VariableArray, max_length: 2147483647, type: Multi).t() + + @type t :: %__MODULE__{value: value(), type: build_type(Int).t()} + + defstruct [:value, :type] + + @spec new(value :: value(), type :: build_type(Int).t()) :: t() + def new(value, %build_type(Int){} = type), do: %__MODULE__{value: value, type: type} + + @impl true + def encode_xdr(%__MODULE__{value: value, type: type}) do + type + |> XDR.Union.new(@arms, value) + |> XDR.Union.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value, type: type}) do + type + |> XDR.Union.new(@arms, value) + |> XDR.Union.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ union_spec()) + + def decode_xdr(bytes, spec) do + case XDR.Union.decode_xdr(bytes, spec) do + {:ok, {{type, value}, rest}} -> {:ok, {new(value, type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ union_spec()) + + def decode_xdr!(bytes, spec) do + {{type, value}, rest} = XDR.Union.decode_xdr!(bytes, spec) + {new(value, type), rest} + end + + @spec union_spec() :: XDR.Union.t() + defp union_spec do + nil + |> build_type(Int).new() + |> XDR.Union.new(@arms) + end +end diff --git a/spec/output/generator_spec_elixir/union.x/my_union.ex b/spec/output/generator_spec_elixir/union.x/my_union.ex new file mode 100644 index 000000000..b6edb53ed --- /dev/null +++ b/spec/output/generator_spec_elixir/union.x/my_union.ex @@ -0,0 +1,73 @@ +defmodule MyXDR.MyUnion do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `MyUnion` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{ + UnionKey, + Error, + build_type(VariableArray, max_length: 2147483647, type: Multi) + } + + @arms [ + ERROR: Error, + MULTI: build_type(VariableArray, max_length: 2147483647, type: Multi) + ] + + @type value :: + Error.t() + | build_type(VariableArray, max_length: 2147483647, type: Multi).t() + + @type t :: %__MODULE__{value: value(), type: UnionKey.t()} + + defstruct [:value, :type] + + @spec new(value :: value(), type :: UnionKey.t()) :: t() + def new(value, %UnionKey{} = type), do: %__MODULE__{value: value, type: type} + + @impl true + def encode_xdr(%__MODULE__{value: value, type: type}) do + type + |> XDR.Union.new(@arms, value) + |> XDR.Union.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value, type: type}) do + type + |> XDR.Union.new(@arms, value) + |> XDR.Union.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ union_spec()) + + def decode_xdr(bytes, spec) do + case XDR.Union.decode_xdr(bytes, spec) do + {:ok, {{type, value}, rest}} -> {:ok, {new(value, type), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ union_spec()) + + def decode_xdr!(bytes, spec) do + {{type, value}, rest} = XDR.Union.decode_xdr!(bytes, spec) + {new(value, type), rest} + end + + @spec union_spec() :: XDR.Union.t() + defp union_spec do + nil + |> UnionKey.new() + |> XDR.Union.new(@arms) + end +end From d9c974acbd4995592b4a7950bb62cd35f1c68ba3 Mon Sep 17 00:00:00 2001 From: Juan Esteban Nieto Cifuentes <89233604+Jenietoc@users.noreply.github.com> Date: Fri, 28 Apr 2023 14:56:37 -0500 Subject: [PATCH 03/13] Add struct type (#3) --- lib/xdrgen/generators/elixir.rb | 167 +++++++++++++++++- .../nesting.x/MyXDR_generated.ex | 7 - .../generator_spec_elixir/nesting.x/one.ex | 65 +++++++ .../generator_spec_elixir/nesting.x/two.ex | 68 +++++++ .../optional.x/MyXDR_generated.ex | 5 - .../optional.x/has_options.ex | 71 ++++++++ .../struct.x/MyXDR_generated.ex | 7 - .../struct.x/my_struct.ex | 77 ++++++++ .../test.x/MyXDR_generated.ex | 23 --- .../generator_spec_elixir/test.x/has_stuff.ex | 65 +++++++ .../test.x/lots_of_my_structs.ex | 65 +++++++ .../generator_spec_elixir/test.x/my_struct.ex | 83 +++++++++ .../test.x/nested_struct.ex | 65 +++++++ .../generator_spec_elixir/test.x/nester.ex | 71 ++++++++ 14 files changed, 790 insertions(+), 49 deletions(-) create mode 100644 spec/output/generator_spec_elixir/nesting.x/one.ex create mode 100644 spec/output/generator_spec_elixir/nesting.x/two.ex create mode 100644 spec/output/generator_spec_elixir/optional.x/has_options.ex create mode 100644 spec/output/generator_spec_elixir/struct.x/my_struct.ex create mode 100644 spec/output/generator_spec_elixir/test.x/has_stuff.ex create mode 100644 spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex create mode 100644 spec/output/generator_spec_elixir/test.x/my_struct.ex create mode 100644 spec/output/generator_spec_elixir/test.x/nested_struct.ex create mode 100644 spec/output/generator_spec_elixir/test.x/nester.ex diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index 97d4dfc75..5e0788334 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -31,7 +31,7 @@ def render_definition(out, defn) case defn when AST::Definitions::Struct ; - render_struct out, defn + render_struct defn when AST::Definitions::Enum ; render_enum defn when AST::Definitions::Union ; @@ -117,14 +117,159 @@ def render_const(out, const) out.puts "define_type(\"#{const_name const}\", Const, #{const.value});" end - def render_struct(out, struct) - out.puts "define_type(\"#{name struct}\", Struct," - out.indent do - struct.members.each_with_index do |m, i| - out.puts "#{member_name m}: #{type_reference m.type}#{comma_unless_last(i, struct.members)}" + def render_struct(struct) + file_name = "#{struct.name.underscore.downcase}.ex" + out = @output.open(file_name) + + render_define_block_enum_type(out, struct.name) do + out.indent do + alias_namespace = "alias #{@namespace}.{" + struct.members.each_with_index do |m, i| + alias_namespace += "#{type_reference m.type}#{comma_and_space_unless_last(i, struct.members)}" + end + alias_namespace += "} \n\n" + out.puts alias_namespace + + out.puts "@struct_spec XDR.Struct.new(" + out.indent do + struct.members.each_with_index do |m, i| + out.puts "#{m.name}: #{type_reference m.type}#{comma_unless_last(i, struct.members)}" + end + end + out.puts ")\n\n" + + struct.members.each_with_index do |m, i| + out.puts "@type #{m.name} :: #{type_reference m.type}.t()" + end + out.puts "\n" + + types = "@type t :: %__MODULE__{" + struct.members.each_with_index do |m, i| + types += "#{m.name}: #{m.name}()#{comma_and_space_unless_last(i, struct.members)}" + end + types += "}\n\n" + out.puts types + + def_struct = "defstruct [" + struct.members.each_with_index do |m, i| + def_struct += ":#{m.name}#{comma_and_space_unless_last(i, struct.members)}" + end + def_struct += "]\n\n" + out.puts def_struct + + spec = "@spec new(" + struct.members.each_with_index do |m, i| + spec += "#{m.name} :: #{m.name}()#{comma_and_space_unless_last(i, struct.members)}" + end + spec += ") :: t()\n\n" + out.puts spec + + out.puts "def new(\n" + out.indent do + struct.members.each_with_index do |m, i| + out.puts "%#{type_reference m.type}{} = #{m.name}#{comma_unless_last(i, struct.members)}" + end + end + out.puts "),\n" + function = "do: %__MODULE__{" + struct.members.each_with_index do |m, i| + function += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + end + function += "}\n\n" + out.puts function + + out.puts "@impl true\n" + impl = "def encode_xdr(%__MODULE__{" + struct.members.each_with_index do |m, i| + impl += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + end + impl += "}) do \n" + out.puts impl + args = "[" + out.indent do + struct.members.each_with_index do |m, i| + args += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + end + args += "]\n" + out.puts args + + out.puts "|> XDR.Struct.new()" + out.puts "|> XDR.Struct.encode_xdr()" + end + out.puts "end \n\n" + + out.puts "@impl true\n" + impl = "def encode_xdr!(%__MODULE__{" + struct.members.each_with_index do |m, i| + impl += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + end + impl += "}) do \n" + out.puts impl + args = "[" + out.indent do + struct.members.each_with_index do |m, i| + args += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + end + args += "]\n" + out.puts args + + out.puts "|> XDR.Struct.new()" + out.puts "|> XDR.Struct.encode_xdr!()" + end + out.puts "end \n\n" + + out.puts "@impl true \n" + out.puts "def decode_xdr(bytes, struct \\\\ @struct_spec) \n\n" + + out.puts "def decode_xdr(bytes, struct) do" + out.indent do + out.puts "case XDR.Struct.decode_xdr(bytes, struct) do" + out.indent do + comp = "{:ok, {%XDR.Struct{components: [" + struct.members.each_with_index do |m, i| + comp += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + end + comp += "]}, rest}} -> \n" + out.puts comp + out.indent do + new_comp = "{:ok, {new(" + struct.members.each_with_index do |m, i| + new_comp += "#{m.name}#{comma_and_space_unless_last(i, struct.members)}" + end + new_comp += "), rest}}" + out.puts new_comp + end + out.puts "error -> error" + end + out.puts "end" + end + out.puts "end \n\n" + + out.puts "@impl true \n" + out.puts "def decode_xdr!(bytes, struct \\\\ @struct_spec) \n\n" + + out.puts "def decode_xdr!(bytes, struct) do" + out.indent do + comp = "{%XDR.Struct{components: [" + struct.members.each_with_index do |m, i| + comp += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + end + comp += "]}, rest} = \n" + out.puts comp + out.indent do + out.puts "XDR.Struct.decode_xdr!(bytes, struct)" + end + new_comp = "{new(" + struct.members.each_with_index do |m, i| + new_comp += "#{m.name}#{comma_and_space_unless_last(i, struct.members)}" + end + new_comp += "), rest}" + out.puts new_comp + end + out.puts "end" end end - out.puts ")" + out.close end def render_enum(enum) @@ -345,6 +490,14 @@ def comma_unless_last(index, collection) end end + def comma_and_space_unless_last(index, collection) + if index + 1 >= collection.length + "" + else + ", " + end + end + # the args to supply build_type (or define_type(name, ...args)) def build_type_args(type) base_ref = case type diff --git a/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex index 8ba9977ba..2456d8386 100644 --- a/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex @@ -33,9 +33,6 @@ defmodule MyXDR do } """ - define_type("MyUnionOne", Struct, - SOME_INT: build_type(Int) - ) comment ~S""" XDR Source Code:: @@ -46,10 +43,6 @@ defmodule MyXDR do } """ - define_type("MyUnionTwo", Struct, - SOME_INT: build_type(Int), - FOO: Foo - ) comment ~S""" XDR Source Code:: diff --git a/spec/output/generator_spec_elixir/nesting.x/one.ex b/spec/output/generator_spec_elixir/nesting.x/one.ex new file mode 100644 index 000000000..63531148d --- /dev/null +++ b/spec/output/generator_spec_elixir/nesting.x/one.ex @@ -0,0 +1,65 @@ +defmodule MyXDR.One do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `One` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{build_type(Int)} + + @struct_spec XDR.Struct.new( + someInt: build_type(Int) + ) + + @type someInt :: build_type(Int).t() + + @type t :: %__MODULE__{someInt: someInt()} + + defstruct [:someInt] + + @spec new(someInt :: someInt()) :: t() + + def new( + %build_type(Int){} = someInt + ), + do: %__MODULE__{someInt: someInt} + + @impl true + def encode_xdr(%__MODULE__{someInt: someInt}) do + [someInt: someInt] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{someInt: someInt}) do + [someInt: someInt] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) + + def decode_xdr(bytes, struct) do + case XDR.Struct.decode_xdr(bytes, struct) do + {:ok, {%XDR.Struct{components: [someInt: someInt]}, rest}} -> + {:ok, {new(someInt), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) + + def decode_xdr!(bytes, struct) do + {%XDR.Struct{components: [someInt: someInt]}, rest} = + XDR.Struct.decode_xdr!(bytes, struct) + {new(someInt), rest} + end +end diff --git a/spec/output/generator_spec_elixir/nesting.x/two.ex b/spec/output/generator_spec_elixir/nesting.x/two.ex new file mode 100644 index 000000000..0961898a7 --- /dev/null +++ b/spec/output/generator_spec_elixir/nesting.x/two.ex @@ -0,0 +1,68 @@ +defmodule MyXDR.Two do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Two` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{build_type(Int), Foo} + + @struct_spec XDR.Struct.new( + someInt: build_type(Int), + foo: Foo + ) + + @type someInt :: build_type(Int).t() + @type foo :: Foo.t() + + @type t :: %__MODULE__{someInt: someInt(), foo: foo()} + + defstruct [:someInt, :foo] + + @spec new(someInt :: someInt(), foo :: foo()) :: t() + + def new( + %build_type(Int){} = someInt, + %Foo{} = foo + ), + do: %__MODULE__{someInt: someInt, foo: foo} + + @impl true + def encode_xdr(%__MODULE__{someInt: someInt, foo: foo}) do + [someInt: someInt, foo: foo] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{someInt: someInt, foo: foo}) do + [someInt: someInt, foo: foo] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) + + def decode_xdr(bytes, struct) do + case XDR.Struct.decode_xdr(bytes, struct) do + {:ok, {%XDR.Struct{components: [someInt: someInt, foo: foo]}, rest}} -> + {:ok, {new(someInt, foo), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) + + def decode_xdr!(bytes, struct) do + {%XDR.Struct{components: [someInt: someInt, foo: foo]}, rest} = + XDR.Struct.decode_xdr!(bytes, struct) + {new(someInt, foo), rest} + end +end diff --git a/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex index 54395c37a..5ffdd92eb 100644 --- a/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex @@ -25,10 +25,5 @@ defmodule MyXDR do }; """ - define_type("HasOptions", Struct, - FIRST_OPTION: build_type(Optional, buid_type(base_ref)), - SECOND_OPTION: build_type(Optional, buid_type(base_ref)), - THIRD_OPTION: build_type(Optional, Arr) - ) end diff --git a/spec/output/generator_spec_elixir/optional.x/has_options.ex b/spec/output/generator_spec_elixir/optional.x/has_options.ex new file mode 100644 index 000000000..f445694db --- /dev/null +++ b/spec/output/generator_spec_elixir/optional.x/has_options.ex @@ -0,0 +1,71 @@ +defmodule MyXDR.HasOptions do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `HasOptions` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{build_type(Optional, buid_type(base_ref)), build_type(Optional, buid_type(base_ref)), build_type(Optional, Arr)} + + @struct_spec XDR.Struct.new( + firstOption: build_type(Optional, buid_type(base_ref)), + secondOption: build_type(Optional, buid_type(base_ref)), + thirdOption: build_type(Optional, Arr) + ) + + @type firstOption :: build_type(Optional, buid_type(base_ref)).t() + @type secondOption :: build_type(Optional, buid_type(base_ref)).t() + @type thirdOption :: build_type(Optional, Arr).t() + + @type t :: %__MODULE__{firstOption: firstOption(), secondOption: secondOption(), thirdOption: thirdOption()} + + defstruct [:firstOption, :secondOption, :thirdOption] + + @spec new(firstOption :: firstOption(), secondOption :: secondOption(), thirdOption :: thirdOption()) :: t() + + def new( + %build_type(Optional, buid_type(base_ref)){} = firstOption, + %build_type(Optional, buid_type(base_ref)){} = secondOption, + %build_type(Optional, Arr){} = thirdOption + ), + do: %__MODULE__{firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption} + + @impl true + def encode_xdr(%__MODULE__{firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption}) do + [firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption}) do + [firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) + + def decode_xdr(bytes, struct) do + case XDR.Struct.decode_xdr(bytes, struct) do + {:ok, {%XDR.Struct{components: [firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption]}, rest}} -> + {:ok, {new(firstOption, secondOption, thirdOption), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) + + def decode_xdr!(bytes, struct) do + {%XDR.Struct{components: [firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption]}, rest} = + XDR.Struct.decode_xdr!(bytes, struct) + {new(firstOption, secondOption, thirdOption), rest} + end +end diff --git a/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex index 9f0c05481..fb2b616cf 100644 --- a/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex @@ -27,12 +27,5 @@ defmodule MyXDR do }; """ - define_type("MyStruct", Struct, - SOME_INT: build_type(Int), - A_BIG_INT: Int64, - SOME_OPAQUE: build_type(Opaque, 10), - SOME_STRING: build_type(XDR.Type.String, ), - MAX_STRING: build_type(XDR.Type.String, 100) - ) end diff --git a/spec/output/generator_spec_elixir/struct.x/my_struct.ex b/spec/output/generator_spec_elixir/struct.x/my_struct.ex new file mode 100644 index 000000000..b1593bf57 --- /dev/null +++ b/spec/output/generator_spec_elixir/struct.x/my_struct.ex @@ -0,0 +1,77 @@ +defmodule MyXDR.MyStruct do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `MyStruct` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{build_type(Int), Int64, build_type(Opaque, 10), build_type(XDR.Type.String, ), build_type(XDR.Type.String, 100)} + + @struct_spec XDR.Struct.new( + someInt: build_type(Int), + aBigInt: Int64, + someOpaque: build_type(Opaque, 10), + someString: build_type(XDR.Type.String, ), + maxString: build_type(XDR.Type.String, 100) + ) + + @type someInt :: build_type(Int).t() + @type aBigInt :: Int64.t() + @type someOpaque :: build_type(Opaque, 10).t() + @type someString :: build_type(XDR.Type.String, ).t() + @type maxString :: build_type(XDR.Type.String, 100).t() + + @type t :: %__MODULE__{someInt: someInt(), aBigInt: aBigInt(), someOpaque: someOpaque(), someString: someString(), maxString: maxString()} + + defstruct [:someInt, :aBigInt, :someOpaque, :someString, :maxString] + + @spec new(someInt :: someInt(), aBigInt :: aBigInt(), someOpaque :: someOpaque(), someString :: someString(), maxString :: maxString()) :: t() + + def new( + %build_type(Int){} = someInt, + %Int64{} = aBigInt, + %build_type(Opaque, 10){} = someOpaque, + %build_type(XDR.Type.String, ){} = someString, + %build_type(XDR.Type.String, 100){} = maxString + ), + do: %__MODULE__{someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString} + + @impl true + def encode_xdr(%__MODULE__{someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString}) do + [someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString}) do + [someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) + + def decode_xdr(bytes, struct) do + case XDR.Struct.decode_xdr(bytes, struct) do + {:ok, {%XDR.Struct{components: [someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString]}, rest}} -> + {:ok, {new(someInt, aBigInt, someOpaque, someString, maxString), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) + + def decode_xdr!(bytes, struct) do + {%XDR.Struct{components: [someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString]}, rest} = + XDR.Struct.decode_xdr!(bytes, struct) + {new(someInt, aBigInt, someOpaque, someString, maxString), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex index 1900e13ef..fa08d5a9b 100644 --- a/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex @@ -141,15 +141,6 @@ defmodule MyXDR do }; """ - define_type("MyStruct", Struct, - FIELD1: Uint512, - FIELD2: OptHash1, - FIELD3: Int1, - FIELD4: build_type(UnsignedInt), - FIELD5: build_type(Float), - FIELD6: build_type(Double), - FIELD7: build_type(Bool) - ) comment ~S""" XDR Source Code:: @@ -160,9 +151,6 @@ defmodule MyXDR do }; """ - define_type("LotsOfMyStructs", Struct, - MEMBERS: build_type(VariableArray, max_length: 2147483647, type: MyStruct) - ) comment ~S""" XDR Source Code:: @@ -173,9 +161,6 @@ defmodule MyXDR do }; """ - define_type("HasStuff", Struct, - DATA: LotsOfMyStructs - ) comment ~S""" XDR Source Code:: @@ -222,9 +207,6 @@ defmodule MyXDR do } """ - define_type("NesterNestedStruct", Struct, - BLAH: build_type(Int) - ) comment ~S""" XDR Source Code:: @@ -263,10 +245,5 @@ defmodule MyXDR do }; """ - define_type("Nester", Struct, - NESTED_ENUM: NesterNestedEnum, - NESTED_STRUCT: NesterNestedStruct, - NESTED_UNION: NesterNestedUnion - ) end diff --git a/spec/output/generator_spec_elixir/test.x/has_stuff.ex b/spec/output/generator_spec_elixir/test.x/has_stuff.ex new file mode 100644 index 000000000..290eab989 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/has_stuff.ex @@ -0,0 +1,65 @@ +defmodule MyXDR.HasStuff do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `HasStuff` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{LotsOfMyStructs} + + @struct_spec XDR.Struct.new( + data: LotsOfMyStructs + ) + + @type data :: LotsOfMyStructs.t() + + @type t :: %__MODULE__{data: data()} + + defstruct [:data] + + @spec new(data :: data()) :: t() + + def new( + %LotsOfMyStructs{} = data + ), + do: %__MODULE__{data: data} + + @impl true + def encode_xdr(%__MODULE__{data: data}) do + [data: data] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{data: data}) do + [data: data] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) + + def decode_xdr(bytes, struct) do + case XDR.Struct.decode_xdr(bytes, struct) do + {:ok, {%XDR.Struct{components: [data: data]}, rest}} -> + {:ok, {new(data), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) + + def decode_xdr!(bytes, struct) do + {%XDR.Struct{components: [data: data]}, rest} = + XDR.Struct.decode_xdr!(bytes, struct) + {new(data), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex new file mode 100644 index 000000000..5fd24e426 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex @@ -0,0 +1,65 @@ +defmodule MyXDR.LotsOfMyStructs do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `LotsOfMyStructs` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{build_type(VariableArray, max_length: 2147483647, type: MyStruct)} + + @struct_spec XDR.Struct.new( + members: build_type(VariableArray, max_length: 2147483647, type: MyStruct) + ) + + @type members :: build_type(VariableArray, max_length: 2147483647, type: MyStruct).t() + + @type t :: %__MODULE__{members: members()} + + defstruct [:members] + + @spec new(members :: members()) :: t() + + def new( + %build_type(VariableArray, max_length: 2147483647, type: MyStruct){} = members + ), + do: %__MODULE__{members: members} + + @impl true + def encode_xdr(%__MODULE__{members: members}) do + [members: members] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{members: members}) do + [members: members] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) + + def decode_xdr(bytes, struct) do + case XDR.Struct.decode_xdr(bytes, struct) do + {:ok, {%XDR.Struct{components: [members: members]}, rest}} -> + {:ok, {new(members), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) + + def decode_xdr!(bytes, struct) do + {%XDR.Struct{components: [members: members]}, rest} = + XDR.Struct.decode_xdr!(bytes, struct) + {new(members), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/my_struct.ex b/spec/output/generator_spec_elixir/test.x/my_struct.ex new file mode 100644 index 000000000..28713b110 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/my_struct.ex @@ -0,0 +1,83 @@ +defmodule MyXDR.MyStruct do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `MyStruct` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{Uint512, OptHash1, Int1, build_type(UnsignedInt), build_type(Float), build_type(Double), build_type(Bool)} + + @struct_spec XDR.Struct.new( + field1: Uint512, + field2: OptHash1, + field3: Int1, + field4: build_type(UnsignedInt), + field5: build_type(Float), + field6: build_type(Double), + field7: build_type(Bool) + ) + + @type field1 :: Uint512.t() + @type field2 :: OptHash1.t() + @type field3 :: Int1.t() + @type field4 :: build_type(UnsignedInt).t() + @type field5 :: build_type(Float).t() + @type field6 :: build_type(Double).t() + @type field7 :: build_type(Bool).t() + + @type t :: %__MODULE__{field1: field1(), field2: field2(), field3: field3(), field4: field4(), field5: field5(), field6: field6(), field7: field7()} + + defstruct [:field1, :field2, :field3, :field4, :field5, :field6, :field7] + + @spec new(field1 :: field1(), field2 :: field2(), field3 :: field3(), field4 :: field4(), field5 :: field5(), field6 :: field6(), field7 :: field7()) :: t() + + def new( + %Uint512{} = field1, + %OptHash1{} = field2, + %Int1{} = field3, + %build_type(UnsignedInt){} = field4, + %build_type(Float){} = field5, + %build_type(Double){} = field6, + %build_type(Bool){} = field7 + ), + do: %__MODULE__{field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7} + + @impl true + def encode_xdr(%__MODULE__{field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7}) do + [field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7}) do + [field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) + + def decode_xdr(bytes, struct) do + case XDR.Struct.decode_xdr(bytes, struct) do + {:ok, {%XDR.Struct{components: [field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7]}, rest}} -> + {:ok, {new(field1, field2, field3, field4, field5, field6, field7), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) + + def decode_xdr!(bytes, struct) do + {%XDR.Struct{components: [field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7]}, rest} = + XDR.Struct.decode_xdr!(bytes, struct) + {new(field1, field2, field3, field4, field5, field6, field7), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/nested_struct.ex b/spec/output/generator_spec_elixir/test.x/nested_struct.ex new file mode 100644 index 000000000..776e589e9 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/nested_struct.ex @@ -0,0 +1,65 @@ +defmodule MyXDR.NestedStruct do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `NestedStruct` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{build_type(Int)} + + @struct_spec XDR.Struct.new( + blah: build_type(Int) + ) + + @type blah :: build_type(Int).t() + + @type t :: %__MODULE__{blah: blah()} + + defstruct [:blah] + + @spec new(blah :: blah()) :: t() + + def new( + %build_type(Int){} = blah + ), + do: %__MODULE__{blah: blah} + + @impl true + def encode_xdr(%__MODULE__{blah: blah}) do + [blah: blah] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{blah: blah}) do + [blah: blah] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) + + def decode_xdr(bytes, struct) do + case XDR.Struct.decode_xdr(bytes, struct) do + {:ok, {%XDR.Struct{components: [blah: blah]}, rest}} -> + {:ok, {new(blah), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) + + def decode_xdr!(bytes, struct) do + {%XDR.Struct{components: [blah: blah]}, rest} = + XDR.Struct.decode_xdr!(bytes, struct) + {new(blah), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/nester.ex b/spec/output/generator_spec_elixir/test.x/nester.ex new file mode 100644 index 000000000..3b7755dd6 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/nester.ex @@ -0,0 +1,71 @@ +defmodule MyXDR.Nester do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Nester` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.{NesterNestedEnum, NesterNestedStruct, NesterNestedUnion} + + @struct_spec XDR.Struct.new( + nestedEnum: NesterNestedEnum, + nestedStruct: NesterNestedStruct, + nestedUnion: NesterNestedUnion + ) + + @type nestedEnum :: NesterNestedEnum.t() + @type nestedStruct :: NesterNestedStruct.t() + @type nestedUnion :: NesterNestedUnion.t() + + @type t :: %__MODULE__{nestedEnum: nestedEnum(), nestedStruct: nestedStruct(), nestedUnion: nestedUnion()} + + defstruct [:nestedEnum, :nestedStruct, :nestedUnion] + + @spec new(nestedEnum :: nestedEnum(), nestedStruct :: nestedStruct(), nestedUnion :: nestedUnion()) :: t() + + def new( + %NesterNestedEnum{} = nestedEnum, + %NesterNestedStruct{} = nestedStruct, + %NesterNestedUnion{} = nestedUnion + ), + do: %__MODULE__{nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion} + + @impl true + def encode_xdr(%__MODULE__{nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion}) do + [nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion}) do + [nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion] + |> XDR.Struct.new() + |> XDR.Struct.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) + + def decode_xdr(bytes, struct) do + case XDR.Struct.decode_xdr(bytes, struct) do + {:ok, {%XDR.Struct{components: [nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion]}, rest}} -> + {:ok, {new(nestedEnum, nestedStruct, nestedUnion), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) + + def decode_xdr!(bytes, struct) do + {%XDR.Struct{components: [nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion]}, rest} = + XDR.Struct.decode_xdr!(bytes, struct) + {new(nestedEnum, nestedStruct, nestedUnion), rest} + end +end From 1d69a2160db36b9b9c33fc41896b7a626b3dba43 Mon Sep 17 00:00:00 2001 From: Elisabet Salazar <40662951+elisa6@users.noreply.github.com> Date: Wed, 3 May 2023 12:28:10 -0500 Subject: [PATCH 04/13] Add a function to generate a typedef with number types (#4) * Add function to create number types * Remove unnecessary function * Add condition for union type --- lib/xdrgen/generators/elixir.rb | 265 +++++++++++++----- .../const.x/MyXDR_generated.ex | 2 - .../const.x/testarray.ex | 47 ++++ .../const.x/testarray2.ex | 47 ++++ .../nesting.x/MyXDR_generated.ex | 1 - .../generator_spec_elixir/nesting.x/foo.ex | 47 ++++ .../nesting.x/my_union.ex | 1 + .../generator_spec_elixir/nesting.x/one.ex | 8 +- .../generator_spec_elixir/nesting.x/two.ex | 8 +- .../optional.x/MyXDR_generated.ex | 1 - .../generator_spec_elixir/optional.x/arr.ex | 47 ++++ .../optional.x/has_options.ex | 20 +- .../struct.x/MyXDR_generated.ex | 1 - .../generator_spec_elixir/struct.x/int64.ex | 47 ++++ .../struct.x/my_struct.ex | 26 +- .../test.x/MyXDR_generated.ex | 15 - .../generator_spec_elixir/test.x/hash.ex | 13 + .../generator_spec_elixir/test.x/hashes1.ex | 13 + .../generator_spec_elixir/test.x/hashes2.ex | 13 + .../generator_spec_elixir/test.x/hashes3.ex | 13 + .../generator_spec_elixir/test.x/int1.ex | 47 ++++ .../generator_spec_elixir/test.x/int2.ex | 47 ++++ .../generator_spec_elixir/test.x/int3.ex | 47 ++++ .../generator_spec_elixir/test.x/int4.ex | 47 ++++ .../test.x/lots_of_my_structs.ex | 8 +- .../generator_spec_elixir/test.x/my_struct.ex | 26 +- .../test.x/nested_struct.ex | 8 +- .../test.x/nested_union.ex | 9 +- .../generator_spec_elixir/test.x/opthash1.ex | 13 + .../generator_spec_elixir/test.x/opthash2.ex | 13 + .../generator_spec_elixir/test.x/str.ex | 13 + .../generator_spec_elixir/test.x/str2.ex | 13 + .../generator_spec_elixir/test.x/uint512.ex | 13 + .../generator_spec_elixir/test.x/uint513.ex | 13 + .../generator_spec_elixir/test.x/uint514.ex | 13 + .../union.x/MyXDR_generated.ex | 3 - .../generator_spec_elixir/union.x/error.ex | 47 ++++ .../union.x/int_union.ex | 16 +- .../union.x/intunion2.ex | 13 + .../generator_spec_elixir/union.x/multi.ex | 47 ++++ .../generator_spec_elixir/union.x/my_union.ex | 6 +- 41 files changed, 940 insertions(+), 157 deletions(-) create mode 100644 spec/output/generator_spec_elixir/const.x/testarray.ex create mode 100644 spec/output/generator_spec_elixir/const.x/testarray2.ex create mode 100644 spec/output/generator_spec_elixir/nesting.x/foo.ex create mode 100644 spec/output/generator_spec_elixir/optional.x/arr.ex create mode 100644 spec/output/generator_spec_elixir/struct.x/int64.ex create mode 100644 spec/output/generator_spec_elixir/test.x/hash.ex create mode 100644 spec/output/generator_spec_elixir/test.x/hashes1.ex create mode 100644 spec/output/generator_spec_elixir/test.x/hashes2.ex create mode 100644 spec/output/generator_spec_elixir/test.x/hashes3.ex create mode 100644 spec/output/generator_spec_elixir/test.x/int1.ex create mode 100644 spec/output/generator_spec_elixir/test.x/int2.ex create mode 100644 spec/output/generator_spec_elixir/test.x/int3.ex create mode 100644 spec/output/generator_spec_elixir/test.x/int4.ex create mode 100644 spec/output/generator_spec_elixir/test.x/opthash1.ex create mode 100644 spec/output/generator_spec_elixir/test.x/opthash2.ex create mode 100644 spec/output/generator_spec_elixir/test.x/str.ex create mode 100644 spec/output/generator_spec_elixir/test.x/str2.ex create mode 100644 spec/output/generator_spec_elixir/test.x/uint512.ex create mode 100644 spec/output/generator_spec_elixir/test.x/uint513.ex create mode 100644 spec/output/generator_spec_elixir/test.x/uint514.ex create mode 100644 spec/output/generator_spec_elixir/union.x/error.ex create mode 100644 spec/output/generator_spec_elixir/union.x/intunion2.ex create mode 100644 spec/output/generator_spec_elixir/union.x/multi.ex diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index 5e0788334..9a0d148f4 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -35,9 +35,9 @@ def render_definition(out, defn) when AST::Definitions::Enum ; render_enum defn when AST::Definitions::Union ; - render_union out, defn + render_union defn when AST::Definitions::Typedef ; - render_typedef out, defn + render_typedef defn when AST::Definitions::Const ; render_const out, defn end @@ -109,8 +109,16 @@ def render_define_block_enum_type(out, module_name) out.break end - def render_typedef(out, typedef) - out.puts "define_type(\"#{name typedef}\", #{build_type_args typedef.declaration.type})" + def render_typedef(typedef) + file_name = "#{typedef.name.downcase}.ex" + out = @output.open(file_name) + + render_define_block_enum_type(out, typedef.name.downcase) do + out.indent do + build_typedef(out, typedef) + end + end + out.close end def render_const(out, const) @@ -125,7 +133,7 @@ def render_struct(struct) out.indent do alias_namespace = "alias #{@namespace}.{" struct.members.each_with_index do |m, i| - alias_namespace += "#{type_reference m.type}#{comma_and_space_unless_last(i, struct.members)}" + alias_namespace += "#{type_reference m, m.name.camelize}#{comma_and_space_unless_last(i, struct.members)}" end alias_namespace += "} \n\n" out.puts alias_namespace @@ -133,56 +141,56 @@ def render_struct(struct) out.puts "@struct_spec XDR.Struct.new(" out.indent do struct.members.each_with_index do |m, i| - out.puts "#{m.name}: #{type_reference m.type}#{comma_unless_last(i, struct.members)}" + out.puts "#{m.name}: #{type_reference m, m.name.camelize}#{comma_unless_last(i, struct.members)}" end end out.puts ")\n\n" struct.members.each_with_index do |m, i| - out.puts "@type #{m.name} :: #{type_reference m.type}.t()" + out.puts "@type #{m.name} :: #{type_reference m, m.name.camelize}.t()" end out.puts "\n" types = "@type t :: %__MODULE__{" - struct.members.each_with_index do |m, i| + struct.members.each_with_index do |m, i| types += "#{m.name}: #{m.name}()#{comma_and_space_unless_last(i, struct.members)}" - end + end types += "}\n\n" out.puts types def_struct = "defstruct [" - struct.members.each_with_index do |m, i| + struct.members.each_with_index do |m, i| def_struct += ":#{m.name}#{comma_and_space_unless_last(i, struct.members)}" - end + end def_struct += "]\n\n" out.puts def_struct spec = "@spec new(" - struct.members.each_with_index do |m, i| + struct.members.each_with_index do |m, i| spec += "#{m.name} :: #{m.name}()#{comma_and_space_unless_last(i, struct.members)}" - end + end spec += ") :: t()\n\n" out.puts spec out.puts "def new(\n" out.indent do struct.members.each_with_index do |m, i| - out.puts "%#{type_reference m.type}{} = #{m.name}#{comma_unless_last(i, struct.members)}" + out.puts "%#{type_reference m, m.name.camelize}{} = #{m.name}#{comma_unless_last(i, struct.members)}" end end out.puts "),\n" function = "do: %__MODULE__{" - struct.members.each_with_index do |m, i| + struct.members.each_with_index do |m, i| function += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" - end + end function += "}\n\n" out.puts function out.puts "@impl true\n" impl = "def encode_xdr(%__MODULE__{" - struct.members.each_with_index do |m, i| + struct.members.each_with_index do |m, i| impl += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" - end + end impl += "}) do \n" out.puts impl args = "[" @@ -200,9 +208,9 @@ def render_struct(struct) out.puts "@impl true\n" impl = "def encode_xdr!(%__MODULE__{" - struct.members.each_with_index do |m, i| + struct.members.each_with_index do |m, i| impl += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" - end + end impl += "}) do \n" out.puts impl args = "[" @@ -340,21 +348,20 @@ def render_enum(enum) end end - def render_union(out, union) + def render_union(union) file_name = "#{union.name.underscore.downcase}.ex" out = @output.open(file_name) + union_name_camelize = union.name.camelize + union_discriminant = union.discriminant render_define_block_enum_type(out, union.name) do out.indent do out.puts "alias #{@namespace}.{\n" out.indent do - out.puts "#{type_reference union.discriminant.type}," - union.normal_arms.each_with_index do |arm, i| - arm_name = arm.void? ? "Void" : "#{type_reference arm.type}" - - arm.cases.each do |acase| - out.puts "#{arm_name}#{comma_unless_last(i, union.normal_arms)}" - end + out.puts "#{type_reference union_discriminant, union_name_camelize}," + union.arms.each_with_index do |arm, i| + arm_name = arm.void? ? "Void" : "#{type_reference arm.declaration, arm.name.camelize}" + out.puts "#{arm_name}#{comma_unless_last(i, union.arms)}" end end out.puts "}\n\n" @@ -362,7 +369,7 @@ def render_union(out, union) out.puts "@arms [" out.indent do union.normal_arms.each_with_index do |arm, i| - arm_name = arm.void? ? "Void" : "#{type_reference arm.type}" + arm_name = arm.void? ? "Void" : "#{type_reference arm.declaration, arm.name.camelize}" arm.cases.each do |acase| switch = if acase.value.is_a?(AST::Identifier) @@ -371,31 +378,40 @@ def render_union(out, union) acase.value.text_value end - out.puts "#{switch}: #{arm_name}#{comma_unless_last(i, union.normal_arms)}" + out.puts "#{switch}: #{arm_name}#{comma_unless_last(i, union.arms)}" end end + + if union.default_arm.present? + out.puts "default: #{type_reference union.default_arm.declaration, union.default_arm.name.camelize}" + end end out.puts "]\n\n" out.puts "@type value ::" out.indent(4) do - union.normal_arms.each_with_index do |arm, i| - next if arm.void? + union.arms.each_with_index do |arm, i| + arm_name = arm.void? ? "Void" : "#{type_reference arm.declaration, arm.name.camelize}" if i == 0 - out.puts "#{type_reference arm.type}.t()" + out.puts "#{arm_name}.t()" else - out.puts "| #{type_reference arm.type}.t()" + out.puts "| #{arm_name}.t()" end end + + if union.default_arm.present? + out.puts "| any()" + end + end out.puts "\n" - out.puts "@type t :: %__MODULE__{value: value(), type: #{type_reference union.discriminant.type}.t()}\n\n" + out.puts "@type t :: %__MODULE__{value: value(), type: #{type_reference union_discriminant, union_name_camelize}.t()}\n\n" out.puts "defstruct [:value, :type]\n\n" - out.puts "@spec new(value :: value(), type :: #{type_reference union.discriminant.type}.t()) :: t()\n" - out.puts "def new(value, %#{type_reference union.discriminant.type}{} = type), do: %__MODULE__{value: value, type: type}\n\n" + out.puts "@spec new(value :: value(), type :: #{type_reference union_discriminant, union_name_camelize}.t()) :: t()\n" + out.puts "def new(value, %#{type_reference union_discriminant, union_name_camelize}{} = type), do: %__MODULE__{value: value, type: type}\n\n" out.puts "@impl true" out.puts "def encode_xdr(%__MODULE__{value: value, type: type}) do\n" @@ -443,7 +459,7 @@ def render_union(out, union) out.puts "defp union_spec do" out.indent do out.puts "nil\n" - out.puts "|> #{type_reference union.discriminant.type}.new()\n" + out.puts "|> #{type_reference union_discriminant, union_name_camelize}.new()\n" out.puts "|> XDR.Union.new(@arms)\n" end out.puts "end\n" @@ -473,13 +489,21 @@ def member_name(member) name(member).underscore.upcase end - # this can be a string to reference a custom type - # or a build_type call like build_type(VariableOpaque, 100) - # args for build_type can be created with build_type_args - def type_reference(type) - build_args = build_type_args(type) + def type_reference(decl, container_name) + type_hint = type_string decl.type + + if type_hint == container_name + type_hint = "#{type_hint}" + end - build_args === "#{name type}" ? build_args : "build_type(#{build_args})" + case decl.type.sub_type + when :optional + "Optional#{type_hint}" + when :var_array, :array + "#{type_hint}List" + else + type_hint + end end def comma_unless_last(index, collection) @@ -498,13 +522,12 @@ def comma_and_space_unless_last(index, collection) end end - # the args to supply build_type (or define_type(name, ...args)) - def build_type_args(type) - base_ref = case type + def type_string(type) + case type when AST::Typespecs::Bool "Bool" when AST::Typespecs::Double - "Double" + "DoubleFloat" when AST::Typespecs::Float "Float" when AST::Typespecs::Hyper @@ -513,18 +536,18 @@ def build_type_args(type) "Int" when AST::Typespecs::Opaque if type.fixed? - "Opaque, #{type.size}" + "FixedOpaque#{type.size}" else - type.size ? "VariableOpaque, #{type.size}" : "VariableOpaque" + type.size ? "VariableOpaque#{type.size}" : "VariableOpaque" end when AST::Typespecs::Quadruple raise "no quadruple support in elixir" when AST::Typespecs::String - "XDR.Type.String, #{type.size}" + "String#{type.size}" when AST::Typespecs::UnsignedHyper - "UnsignedHyperInt" + "HyperUInt" when AST::Typespecs::UnsignedInt - "UnsignedInt" + "UInt" when AST::Typespecs::Simple "#{name type}" when AST::Definitions::Base @@ -534,24 +557,128 @@ def build_type_args(type) else raise "Unknown reference type: #{type.class.name}, #{type.class.ancestors}" end + end - base_type = base_ref === "#{name type}" ? base_ref : "buid_type(base_ref)" + def build_number_typedef(out, number_type, type, attribute) + out.puts "@type t :: %__MODULE__{#{attribute}: #{number_type}()}\n\n" - case type.sub_type - when :simple - base_ref - when :optional - "Optional, #{base_type}" - when :array - is_named, size = type.array_size - size = is_named ? "\"#{size}\"" : size - "Array, length: #{size}, type: #{base_type}" - when :var_array - is_named, size = type.array_size - size = is_named ? "\"#{size}\"" : (size || MAX_INT) - "VariableArray, max_length: #{size}, type: #{base_type}" - else - raise "Unknown sub_type: #{type.sub_type}" + out.puts "defstruct [:#{attribute}]\n\n" + + out.puts "@spec new(value :: #{number_type}()) :: t()\n" + out.puts "def new(value), do: %__MODULE__{#{attribute}: value}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{#{attribute}: value}) do\n" + out.indent do + out.puts "XDR.#{type}.encode_xdr(%XDR.#{type}{datum: value})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{#{attribute}: value}) do\n" + out.indent do + out.puts "XDR.#{type}.encode_xdr!(%XDR.#{type}{datum: value})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr(bytes, _term) do\n" + out.indent do + out.puts "case XDR.#{type}.decode_xdr(bytes) do\n" + out.indent do + out.puts "{:ok, {%XDR.#{type}{datum: value}, rest}} -> {:ok, {new(value), rest}}\n" + out.puts "error -> error\n" + end + out.puts "end\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr!(bytes, _term) do\n" + out.indent do + out.puts "{%XDR.#{type}{datum: value}, rest} = XDR.#{type}.decode_xdr!(bytes)\n" + out.puts "{new(value), rest}\n" + end + out.puts "end\n" + end + + def build_bool_typedef(out, number_type, type, attribute) + out.puts "@type t :: %__MODULE__{#{attribute}: #{number_type}()}\n\n" + + out.puts "defstruct [:#{attribute}]\n\n" + + out.puts "@spec new(value :: #{number_type}()) :: t()\n" + out.puts "def new(value), do: %__MODULE__{#{attribute}: value}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{#{attribute}: value}) do\n" + out.indent do + out.puts "XDR.#{type}.encode_xdr(%XDR.#{type}{identifier: value})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{#{attribute}: value}) do\n" + out.indent do + out.puts "XDR.#{type}.encode_xdr!(%XDR.#{type}{identifier: value})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr(bytes, _term) do\n" + out.indent do + out.puts "case XDR.#{type}.decode_xdr(bytes) do\n" + out.indent do + out.puts "{:ok, {%XDR.#{type}{identifier: value}, rest}} -> {:ok, {new(value), rest}}\n" + out.puts "error -> error\n" + end + out.puts "end\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr!(bytes, _term) do\n" + out.indent do + out.puts "{%XDR.#{type}{identifier: value}, rest} = XDR.#{type}.decode_xdr!(bytes)\n" + out.puts "{new(value), rest}\n" + end + out.puts "end\n" + end + + def build_typedef(out, typedef) + type = typedef.declaration.type + base_type = type_string(type) + + case type + when AST::Typespecs::Bool + build_bool_typedef(out, "boolean", "Bool", "bool") + "Bool" + when AST::Typespecs::Double + build_number_typedef(out, "float_number", "DoubleFloat", "float") + "DoubleFloat" + when AST::Typespecs::Float + build_number_typedef(out, "float_number", "Float", "float") + "Float" + when AST::Typespecs::Hyper + build_number_typedef(out, "integer", "HyperInt", "datum") + "HyperInt" + when AST::Typespecs::Int + build_number_typedef(out, "integer", "Int", "datum") + "Int" + when AST::Typespecs::UnsignedHyper + build_number_typedef(out, "non_neg_integer", "HyperUInt", "datum") + "HyperUInt" + when AST::Typespecs::UnsignedInt + build_number_typedef(out, "non_neg_integer", "UInt", "datum") + "UInt" end end end diff --git a/spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex index 0ec181268..182422814 100644 --- a/spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex @@ -20,7 +20,6 @@ defmodule MyXDR do typedef int TestArray[FOO]; """ - define_type("TestArray", Array, length: "FOO", type: buid_type(base_ref)) comment ~S""" XDR Source Code:: @@ -28,6 +27,5 @@ defmodule MyXDR do typedef int TestArray2; """ - define_type("TestArray2", VariableArray, max_length: "FOO", type: buid_type(base_ref)) end diff --git a/spec/output/generator_spec_elixir/const.x/testarray.ex b/spec/output/generator_spec_elixir/const.x/testarray.ex new file mode 100644 index 000000000..1cc29fd1d --- /dev/null +++ b/spec/output/generator_spec_elixir/const.x/testarray.ex @@ -0,0 +1,47 @@ +defmodule MyXDR.Testarray do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Testarray` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(value :: integer()) :: t() + def new(value), do: %__MODULE__{datum: value} + + @impl true + def encode_xdr(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr(%XDR.Int{datum: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: value}, rest} = XDR.Int.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/const.x/testarray2.ex b/spec/output/generator_spec_elixir/const.x/testarray2.ex new file mode 100644 index 000000000..4b016b8e3 --- /dev/null +++ b/spec/output/generator_spec_elixir/const.x/testarray2.ex @@ -0,0 +1,47 @@ +defmodule MyXDR.Testarray2 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Testarray2` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(value :: integer()) :: t() + def new(value), do: %__MODULE__{datum: value} + + @impl true + def encode_xdr(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr(%XDR.Int{datum: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: value}, rest} = XDR.Int.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex index 2456d8386..483f7f1ea 100644 --- a/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex @@ -23,7 +23,6 @@ defmodule MyXDR do typedef int Foo; """ - define_type("Foo", Int) comment ~S""" XDR Source Code:: diff --git a/spec/output/generator_spec_elixir/nesting.x/foo.ex b/spec/output/generator_spec_elixir/nesting.x/foo.ex new file mode 100644 index 000000000..25c851c97 --- /dev/null +++ b/spec/output/generator_spec_elixir/nesting.x/foo.ex @@ -0,0 +1,47 @@ +defmodule MyXDR.Foo do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Foo` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(value :: integer()) :: t() + def new(value), do: %__MODULE__{datum: value} + + @impl true + def encode_xdr(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr(%XDR.Int{datum: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: value}, rest} = XDR.Int.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/nesting.x/my_union.ex b/spec/output/generator_spec_elixir/nesting.x/my_union.ex index 4613ba1f9..4b0d4e393 100644 --- a/spec/output/generator_spec_elixir/nesting.x/my_union.ex +++ b/spec/output/generator_spec_elixir/nesting.x/my_union.ex @@ -26,6 +26,7 @@ defmodule MyXDR.MyUnion do @type value :: MyUnionOne.t() | MyUnionTwo.t() + | Void.t() @type t :: %__MODULE__{value: value(), type: UnionKey.t()} diff --git a/spec/output/generator_spec_elixir/nesting.x/one.ex b/spec/output/generator_spec_elixir/nesting.x/one.ex index 63531148d..79ef4a257 100644 --- a/spec/output/generator_spec_elixir/nesting.x/one.ex +++ b/spec/output/generator_spec_elixir/nesting.x/one.ex @@ -10,13 +10,13 @@ defmodule MyXDR.One do @behaviour XDR.Declaration - alias MyXDR.{build_type(Int)} + alias MyXDR.{Int} @struct_spec XDR.Struct.new( - someInt: build_type(Int) + someInt: Int ) - @type someInt :: build_type(Int).t() + @type someInt :: Int.t() @type t :: %__MODULE__{someInt: someInt()} @@ -25,7 +25,7 @@ defmodule MyXDR.One do @spec new(someInt :: someInt()) :: t() def new( - %build_type(Int){} = someInt + %Int{} = someInt ), do: %__MODULE__{someInt: someInt} diff --git a/spec/output/generator_spec_elixir/nesting.x/two.ex b/spec/output/generator_spec_elixir/nesting.x/two.ex index 0961898a7..ded012ff3 100644 --- a/spec/output/generator_spec_elixir/nesting.x/two.ex +++ b/spec/output/generator_spec_elixir/nesting.x/two.ex @@ -10,14 +10,14 @@ defmodule MyXDR.Two do @behaviour XDR.Declaration - alias MyXDR.{build_type(Int), Foo} + alias MyXDR.{Int, Foo} @struct_spec XDR.Struct.new( - someInt: build_type(Int), + someInt: Int, foo: Foo ) - @type someInt :: build_type(Int).t() + @type someInt :: Int.t() @type foo :: Foo.t() @type t :: %__MODULE__{someInt: someInt(), foo: foo()} @@ -27,7 +27,7 @@ defmodule MyXDR.Two do @spec new(someInt :: someInt(), foo :: foo()) :: t() def new( - %build_type(Int){} = someInt, + %Int{} = someInt, %Foo{} = foo ), do: %__MODULE__{someInt: someInt, foo: foo} diff --git a/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex index 5ffdd92eb..c96405769 100644 --- a/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex @@ -12,7 +12,6 @@ defmodule MyXDR do typedef int Arr[2]; """ - define_type("Arr", Array, length: 2, type: buid_type(base_ref)) comment ~S""" XDR Source Code:: diff --git a/spec/output/generator_spec_elixir/optional.x/arr.ex b/spec/output/generator_spec_elixir/optional.x/arr.ex new file mode 100644 index 000000000..5862e7aa4 --- /dev/null +++ b/spec/output/generator_spec_elixir/optional.x/arr.ex @@ -0,0 +1,47 @@ +defmodule MyXDR.Arr do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Arr` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(value :: integer()) :: t() + def new(value), do: %__MODULE__{datum: value} + + @impl true + def encode_xdr(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr(%XDR.Int{datum: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: value}, rest} = XDR.Int.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/optional.x/has_options.ex b/spec/output/generator_spec_elixir/optional.x/has_options.ex index f445694db..ef49f0e68 100644 --- a/spec/output/generator_spec_elixir/optional.x/has_options.ex +++ b/spec/output/generator_spec_elixir/optional.x/has_options.ex @@ -10,17 +10,17 @@ defmodule MyXDR.HasOptions do @behaviour XDR.Declaration - alias MyXDR.{build_type(Optional, buid_type(base_ref)), build_type(Optional, buid_type(base_ref)), build_type(Optional, Arr)} + alias MyXDR.{OptionalInt, OptionalInt, OptionalArr} @struct_spec XDR.Struct.new( - firstOption: build_type(Optional, buid_type(base_ref)), - secondOption: build_type(Optional, buid_type(base_ref)), - thirdOption: build_type(Optional, Arr) + firstOption: OptionalInt, + secondOption: OptionalInt, + thirdOption: OptionalArr ) - @type firstOption :: build_type(Optional, buid_type(base_ref)).t() - @type secondOption :: build_type(Optional, buid_type(base_ref)).t() - @type thirdOption :: build_type(Optional, Arr).t() + @type firstOption :: OptionalInt.t() + @type secondOption :: OptionalInt.t() + @type thirdOption :: OptionalArr.t() @type t :: %__MODULE__{firstOption: firstOption(), secondOption: secondOption(), thirdOption: thirdOption()} @@ -29,9 +29,9 @@ defmodule MyXDR.HasOptions do @spec new(firstOption :: firstOption(), secondOption :: secondOption(), thirdOption :: thirdOption()) :: t() def new( - %build_type(Optional, buid_type(base_ref)){} = firstOption, - %build_type(Optional, buid_type(base_ref)){} = secondOption, - %build_type(Optional, Arr){} = thirdOption + %OptionalInt{} = firstOption, + %OptionalInt{} = secondOption, + %OptionalArr{} = thirdOption ), do: %__MODULE__{firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption} diff --git a/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex index fb2b616cf..f5897ea44 100644 --- a/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex @@ -12,7 +12,6 @@ defmodule MyXDR do typedef hyper int64; """ - define_type("Int64", HyperInt) comment ~S""" XDR Source Code:: diff --git a/spec/output/generator_spec_elixir/struct.x/int64.ex b/spec/output/generator_spec_elixir/struct.x/int64.ex new file mode 100644 index 000000000..fe44820ba --- /dev/null +++ b/spec/output/generator_spec_elixir/struct.x/int64.ex @@ -0,0 +1,47 @@ +defmodule MyXDR.Int64 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Int64` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(value :: integer()) :: t() + def new(value), do: %__MODULE__{datum: value} + + @impl true + def encode_xdr(%__MODULE__{datum: value}) do + XDR.HyperInt.encode_xdr(%XDR.HyperInt{datum: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: value}) do + XDR.HyperInt.encode_xdr!(%XDR.HyperInt{datum: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperInt{datum: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperInt{datum: value}, rest} = XDR.HyperInt.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/struct.x/my_struct.ex b/spec/output/generator_spec_elixir/struct.x/my_struct.ex index b1593bf57..ebcda295d 100644 --- a/spec/output/generator_spec_elixir/struct.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/struct.x/my_struct.ex @@ -10,21 +10,21 @@ defmodule MyXDR.MyStruct do @behaviour XDR.Declaration - alias MyXDR.{build_type(Int), Int64, build_type(Opaque, 10), build_type(XDR.Type.String, ), build_type(XDR.Type.String, 100)} + alias MyXDR.{Int, Int64, FixedOpaque10, String, String100} @struct_spec XDR.Struct.new( - someInt: build_type(Int), + someInt: Int, aBigInt: Int64, - someOpaque: build_type(Opaque, 10), - someString: build_type(XDR.Type.String, ), - maxString: build_type(XDR.Type.String, 100) + someOpaque: FixedOpaque10, + someString: String, + maxString: String100 ) - @type someInt :: build_type(Int).t() + @type someInt :: Int.t() @type aBigInt :: Int64.t() - @type someOpaque :: build_type(Opaque, 10).t() - @type someString :: build_type(XDR.Type.String, ).t() - @type maxString :: build_type(XDR.Type.String, 100).t() + @type someOpaque :: FixedOpaque10.t() + @type someString :: String.t() + @type maxString :: String100.t() @type t :: %__MODULE__{someInt: someInt(), aBigInt: aBigInt(), someOpaque: someOpaque(), someString: someString(), maxString: maxString()} @@ -33,11 +33,11 @@ defmodule MyXDR.MyStruct do @spec new(someInt :: someInt(), aBigInt :: aBigInt(), someOpaque :: someOpaque(), someString :: someString(), maxString :: maxString()) :: t() def new( - %build_type(Int){} = someInt, + %Int{} = someInt, %Int64{} = aBigInt, - %build_type(Opaque, 10){} = someOpaque, - %build_type(XDR.Type.String, ){} = someString, - %build_type(XDR.Type.String, 100){} = maxString + %FixedOpaque10{} = someOpaque, + %String{} = someString, + %String100{} = maxString ), do: %__MODULE__{someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString} diff --git a/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex index fa08d5a9b..71f97e182 100644 --- a/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex @@ -12,7 +12,6 @@ defmodule MyXDR do typedef opaque uint512[64]; """ - define_type("Uint512", Opaque, 64) comment ~S""" XDR Source Code:: @@ -20,7 +19,6 @@ defmodule MyXDR do typedef opaque uint513<64>; """ - define_type("Uint513", VariableOpaque, 64) comment ~S""" XDR Source Code:: @@ -28,7 +26,6 @@ defmodule MyXDR do typedef opaque uint514<>; """ - define_type("Uint514", VariableOpaque) comment ~S""" XDR Source Code:: @@ -36,7 +33,6 @@ defmodule MyXDR do typedef string str<64>; """ - define_type("Str", XDR.Type.String, 64) comment ~S""" XDR Source Code:: @@ -44,7 +40,6 @@ defmodule MyXDR do typedef string str2<>; """ - define_type("Str2", XDR.Type.String, ) comment ~S""" XDR Source Code:: @@ -52,7 +47,6 @@ defmodule MyXDR do typedef opaque Hash[32]; """ - define_type("Hash", Opaque, 32) comment ~S""" XDR Source Code:: @@ -60,7 +54,6 @@ defmodule MyXDR do typedef Hash Hashes1[12]; """ - define_type("Hashes1", Array, length: 12, type: Hash) comment ~S""" XDR Source Code:: @@ -68,7 +61,6 @@ defmodule MyXDR do typedef Hash Hashes2<12>; """ - define_type("Hashes2", VariableArray, max_length: 12, type: Hash) comment ~S""" XDR Source Code:: @@ -76,7 +68,6 @@ defmodule MyXDR do typedef Hash Hashes3<>; """ - define_type("Hashes3", VariableArray, max_length: 2147483647, type: Hash) comment ~S""" XDR Source Code:: @@ -84,7 +75,6 @@ defmodule MyXDR do typedef Hash *optHash1; """ - define_type("OptHash1", Optional, Hash) comment ~S""" XDR Source Code:: @@ -92,7 +82,6 @@ defmodule MyXDR do typedef Hash* optHash2; """ - define_type("OptHash2", Optional, Hash) comment ~S""" XDR Source Code:: @@ -100,7 +89,6 @@ defmodule MyXDR do typedef int int1; """ - define_type("Int1", Int) comment ~S""" XDR Source Code:: @@ -108,7 +96,6 @@ defmodule MyXDR do typedef hyper int2; """ - define_type("Int2", HyperInt) comment ~S""" XDR Source Code:: @@ -116,7 +103,6 @@ defmodule MyXDR do typedef unsigned int int3; """ - define_type("Int3", UnsignedInt) comment ~S""" XDR Source Code:: @@ -124,7 +110,6 @@ defmodule MyXDR do typedef unsigned hyper int4; """ - define_type("Int4", UnsignedHyperInt) comment ~S""" XDR Source Code:: diff --git a/spec/output/generator_spec_elixir/test.x/hash.ex b/spec/output/generator_spec_elixir/test.x/hash.ex new file mode 100644 index 000000000..bd7b0cacc --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/hash.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Hash do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Hash` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/test.x/hashes1.ex b/spec/output/generator_spec_elixir/test.x/hashes1.ex new file mode 100644 index 000000000..a56834338 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/hashes1.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Hashes1 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Hashes1` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/test.x/hashes2.ex b/spec/output/generator_spec_elixir/test.x/hashes2.ex new file mode 100644 index 000000000..2bbccef76 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/hashes2.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Hashes2 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Hashes2` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/test.x/hashes3.ex b/spec/output/generator_spec_elixir/test.x/hashes3.ex new file mode 100644 index 000000000..238d9aaf1 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/hashes3.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Hashes3 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Hashes3` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/test.x/int1.ex b/spec/output/generator_spec_elixir/test.x/int1.ex new file mode 100644 index 000000000..cce9dcb86 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/int1.ex @@ -0,0 +1,47 @@ +defmodule MyXDR.Int1 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Int1` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(value :: integer()) :: t() + def new(value), do: %__MODULE__{datum: value} + + @impl true + def encode_xdr(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr(%XDR.Int{datum: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: value}, rest} = XDR.Int.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/int2.ex b/spec/output/generator_spec_elixir/test.x/int2.ex new file mode 100644 index 000000000..448877b56 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/int2.ex @@ -0,0 +1,47 @@ +defmodule MyXDR.Int2 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Int2` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(value :: integer()) :: t() + def new(value), do: %__MODULE__{datum: value} + + @impl true + def encode_xdr(%__MODULE__{datum: value}) do + XDR.HyperInt.encode_xdr(%XDR.HyperInt{datum: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: value}) do + XDR.HyperInt.encode_xdr!(%XDR.HyperInt{datum: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperInt{datum: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperInt{datum: value}, rest} = XDR.HyperInt.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/int3.ex b/spec/output/generator_spec_elixir/test.x/int3.ex new file mode 100644 index 000000000..69a976817 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/int3.ex @@ -0,0 +1,47 @@ +defmodule MyXDR.Int3 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Int3` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(value :: non_neg_integer()) :: t() + def new(value), do: %__MODULE__{datum: value} + + @impl true + def encode_xdr(%__MODULE__{datum: value}) do + XDR.UInt.encode_xdr(%XDR.UInt{datum: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: value}) do + XDR.UInt.encode_xdr!(%XDR.UInt{datum: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.UInt.decode_xdr(bytes) do + {:ok, {%XDR.UInt{datum: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.UInt{datum: value}, rest} = XDR.UInt.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/int4.ex b/spec/output/generator_spec_elixir/test.x/int4.ex new file mode 100644 index 000000000..7ecf8d28f --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/int4.ex @@ -0,0 +1,47 @@ +defmodule MyXDR.Int4 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Int4` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(value :: non_neg_integer()) :: t() + def new(value), do: %__MODULE__{datum: value} + + @impl true + def encode_xdr(%__MODULE__{datum: value}) do + XDR.HyperUInt.encode_xdr(%XDR.HyperUInt{datum: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: value}) do + XDR.HyperUInt.encode_xdr!(%XDR.HyperUInt{datum: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperUInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperUInt{datum: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperUInt{datum: value}, rest} = XDR.HyperUInt.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex index 5fd24e426..6219a6f33 100644 --- a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex +++ b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex @@ -10,13 +10,13 @@ defmodule MyXDR.LotsOfMyStructs do @behaviour XDR.Declaration - alias MyXDR.{build_type(VariableArray, max_length: 2147483647, type: MyStruct)} + alias MyXDR.{MyStructList} @struct_spec XDR.Struct.new( - members: build_type(VariableArray, max_length: 2147483647, type: MyStruct) + members: MyStructList ) - @type members :: build_type(VariableArray, max_length: 2147483647, type: MyStruct).t() + @type members :: MyStructList.t() @type t :: %__MODULE__{members: members()} @@ -25,7 +25,7 @@ defmodule MyXDR.LotsOfMyStructs do @spec new(members :: members()) :: t() def new( - %build_type(VariableArray, max_length: 2147483647, type: MyStruct){} = members + %MyStructList{} = members ), do: %__MODULE__{members: members} diff --git a/spec/output/generator_spec_elixir/test.x/my_struct.ex b/spec/output/generator_spec_elixir/test.x/my_struct.ex index 28713b110..a26652931 100644 --- a/spec/output/generator_spec_elixir/test.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/test.x/my_struct.ex @@ -10,25 +10,25 @@ defmodule MyXDR.MyStruct do @behaviour XDR.Declaration - alias MyXDR.{Uint512, OptHash1, Int1, build_type(UnsignedInt), build_type(Float), build_type(Double), build_type(Bool)} + alias MyXDR.{Uint512, OptHash1, Int1, UInt, Float, DoubleFloat, Bool} @struct_spec XDR.Struct.new( field1: Uint512, field2: OptHash1, field3: Int1, - field4: build_type(UnsignedInt), - field5: build_type(Float), - field6: build_type(Double), - field7: build_type(Bool) + field4: UInt, + field5: Float, + field6: DoubleFloat, + field7: Bool ) @type field1 :: Uint512.t() @type field2 :: OptHash1.t() @type field3 :: Int1.t() - @type field4 :: build_type(UnsignedInt).t() - @type field5 :: build_type(Float).t() - @type field6 :: build_type(Double).t() - @type field7 :: build_type(Bool).t() + @type field4 :: UInt.t() + @type field5 :: Float.t() + @type field6 :: DoubleFloat.t() + @type field7 :: Bool.t() @type t :: %__MODULE__{field1: field1(), field2: field2(), field3: field3(), field4: field4(), field5: field5(), field6: field6(), field7: field7()} @@ -40,10 +40,10 @@ defmodule MyXDR.MyStruct do %Uint512{} = field1, %OptHash1{} = field2, %Int1{} = field3, - %build_type(UnsignedInt){} = field4, - %build_type(Float){} = field5, - %build_type(Double){} = field6, - %build_type(Bool){} = field7 + %UInt{} = field4, + %Float{} = field5, + %DoubleFloat{} = field6, + %Bool{} = field7 ), do: %__MODULE__{field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7} diff --git a/spec/output/generator_spec_elixir/test.x/nested_struct.ex b/spec/output/generator_spec_elixir/test.x/nested_struct.ex index 776e589e9..eaea2fe17 100644 --- a/spec/output/generator_spec_elixir/test.x/nested_struct.ex +++ b/spec/output/generator_spec_elixir/test.x/nested_struct.ex @@ -10,13 +10,13 @@ defmodule MyXDR.NestedStruct do @behaviour XDR.Declaration - alias MyXDR.{build_type(Int)} + alias MyXDR.{Int} @struct_spec XDR.Struct.new( - blah: build_type(Int) + blah: Int ) - @type blah :: build_type(Int).t() + @type blah :: Int.t() @type t :: %__MODULE__{blah: blah()} @@ -25,7 +25,7 @@ defmodule MyXDR.NestedStruct do @spec new(blah :: blah()) :: t() def new( - %build_type(Int){} = blah + %Int{} = blah ), do: %__MODULE__{blah: blah} diff --git a/spec/output/generator_spec_elixir/test.x/nested_union.ex b/spec/output/generator_spec_elixir/test.x/nested_union.ex index 9f6c53314..d5cb49b06 100644 --- a/spec/output/generator_spec_elixir/test.x/nested_union.ex +++ b/spec/output/generator_spec_elixir/test.x/nested_union.ex @@ -12,14 +12,19 @@ defmodule MyXDR.NestedUnion do alias MyXDR.{ Color, - Void + Void, + Int } @arms [ - RED: Void + RED: Void, + default: Int ] @type value :: + Void.t() + | Int.t() + | any() @type t :: %__MODULE__{value: value(), type: Color.t()} diff --git a/spec/output/generator_spec_elixir/test.x/opthash1.ex b/spec/output/generator_spec_elixir/test.x/opthash1.ex new file mode 100644 index 000000000..5c1539269 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/opthash1.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Opthash1 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Opthash1` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/test.x/opthash2.ex b/spec/output/generator_spec_elixir/test.x/opthash2.ex new file mode 100644 index 000000000..27eb71c17 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/opthash2.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Opthash2 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Opthash2` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/test.x/str.ex b/spec/output/generator_spec_elixir/test.x/str.ex new file mode 100644 index 000000000..e70cefe21 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/str.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Str do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Str` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/test.x/str2.ex b/spec/output/generator_spec_elixir/test.x/str2.ex new file mode 100644 index 000000000..23aab75a0 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/str2.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Str2 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Str2` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/test.x/uint512.ex b/spec/output/generator_spec_elixir/test.x/uint512.ex new file mode 100644 index 000000000..0df192380 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/uint512.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Uint512 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Uint512` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/test.x/uint513.ex b/spec/output/generator_spec_elixir/test.x/uint513.ex new file mode 100644 index 000000000..37be2acc7 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/uint513.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Uint513 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Uint513` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/test.x/uint514.ex b/spec/output/generator_spec_elixir/test.x/uint514.ex new file mode 100644 index 000000000..4343a32f8 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/uint514.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Uint514 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Uint514` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex index e920b842a..915b47c83 100644 --- a/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex +++ b/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex @@ -12,7 +12,6 @@ defmodule MyXDR do typedef int Error; """ - define_type("Error", Int) comment ~S""" XDR Source Code:: @@ -20,7 +19,6 @@ defmodule MyXDR do typedef int Multi; """ - define_type("Multi", Int) comment ~S""" XDR Source Code:: @@ -67,6 +65,5 @@ defmodule MyXDR do typedef IntUnion IntUnion2; """ - define_type("IntUnion2", IntUnion) end diff --git a/spec/output/generator_spec_elixir/union.x/error.ex b/spec/output/generator_spec_elixir/union.x/error.ex new file mode 100644 index 000000000..43bd58362 --- /dev/null +++ b/spec/output/generator_spec_elixir/union.x/error.ex @@ -0,0 +1,47 @@ +defmodule MyXDR.Error do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Error` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(value :: integer()) :: t() + def new(value), do: %__MODULE__{datum: value} + + @impl true + def encode_xdr(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr(%XDR.Int{datum: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: value}, rest} = XDR.Int.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/union.x/int_union.ex b/spec/output/generator_spec_elixir/union.x/int_union.ex index 1449876af..0dddec70c 100644 --- a/spec/output/generator_spec_elixir/union.x/int_union.ex +++ b/spec/output/generator_spec_elixir/union.x/int_union.ex @@ -11,26 +11,26 @@ defmodule MyXDR.IntUnion do @behaviour XDR.Declaration alias MyXDR.{ - build_type(Int), + Int, Error, - build_type(VariableArray, max_length: 2147483647, type: Multi) + MultiList } @arms [ 0: Error, - 1: build_type(VariableArray, max_length: 2147483647, type: Multi) + 1: MultiList ] @type value :: Error.t() - | build_type(VariableArray, max_length: 2147483647, type: Multi).t() + | MultiList.t() - @type t :: %__MODULE__{value: value(), type: build_type(Int).t()} + @type t :: %__MODULE__{value: value(), type: Int.t()} defstruct [:value, :type] - @spec new(value :: value(), type :: build_type(Int).t()) :: t() - def new(value, %build_type(Int){} = type), do: %__MODULE__{value: value, type: type} + @spec new(value :: value(), type :: Int.t()) :: t() + def new(value, %Int{} = type), do: %__MODULE__{value: value, type: type} @impl true def encode_xdr(%__MODULE__{value: value, type: type}) do @@ -67,7 +67,7 @@ defmodule MyXDR.IntUnion do @spec union_spec() :: XDR.Union.t() defp union_spec do nil - |> build_type(Int).new() + |> Int.new() |> XDR.Union.new(@arms) end end diff --git a/spec/output/generator_spec_elixir/union.x/intunion2.ex b/spec/output/generator_spec_elixir/union.x/intunion2.ex new file mode 100644 index 000000000..7b5533c7b --- /dev/null +++ b/spec/output/generator_spec_elixir/union.x/intunion2.ex @@ -0,0 +1,13 @@ +defmodule MyXDR.Intunion2 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Intunion2` type. + """ + + @behaviour XDR.Declaration + +end diff --git a/spec/output/generator_spec_elixir/union.x/multi.ex b/spec/output/generator_spec_elixir/union.x/multi.ex new file mode 100644 index 000000000..435faab99 --- /dev/null +++ b/spec/output/generator_spec_elixir/union.x/multi.ex @@ -0,0 +1,47 @@ +defmodule MyXDR.Multi do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Multi` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(value :: integer()) :: t() + def new(value), do: %__MODULE__{datum: value} + + @impl true + def encode_xdr(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr(%XDR.Int{datum: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: value}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: value}, rest} = XDR.Int.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/union.x/my_union.ex b/spec/output/generator_spec_elixir/union.x/my_union.ex index b6edb53ed..d5be55f6f 100644 --- a/spec/output/generator_spec_elixir/union.x/my_union.ex +++ b/spec/output/generator_spec_elixir/union.x/my_union.ex @@ -13,17 +13,17 @@ defmodule MyXDR.MyUnion do alias MyXDR.{ UnionKey, Error, - build_type(VariableArray, max_length: 2147483647, type: Multi) + MultiList } @arms [ ERROR: Error, - MULTI: build_type(VariableArray, max_length: 2147483647, type: Multi) + MULTI: MultiList ] @type value :: Error.t() - | build_type(VariableArray, max_length: 2147483647, type: Multi).t() + | MultiList.t() @type t :: %__MODULE__{value: value(), type: UnionKey.t()} From 9aca4eaca35056190e6540452c902af2e85157d7 Mon Sep 17 00:00:00 2001 From: Elisabet Salazar <40662951+elisa6@users.noreply.github.com> Date: Wed, 3 May 2023 15:25:36 -0500 Subject: [PATCH 05/13] Add base file and fix struct type (#5) Co-authored-by: Juan Esteban Nieto Cifuentes --- lib/xdrgen/generators/elixir.rb | 154 +++--- lib/xdrgen/generators/elixir/base.ex | 439 ++++++++++++++++++ .../block_comments.x/base.ex | 439 ++++++++++++++++++ .../generator_spec_elixir/const.x/base.ex | 439 ++++++++++++++++++ .../generator_spec_elixir/const.x/foo.ex | 1 + .../generator_spec_elixir/enum.x/base.ex | 439 ++++++++++++++++++ .../generator_spec_elixir/nesting.x/base.ex | 439 ++++++++++++++++++ .../generator_spec_elixir/nesting.x/one.ex | 45 +- .../generator_spec_elixir/nesting.x/two.ex | 45 +- .../generator_spec_elixir/optional.x/base.ex | 439 ++++++++++++++++++ .../optional.x/has_options.ex | 57 ++- .../generator_spec_elixir/struct.x/base.ex | 439 ++++++++++++++++++ .../struct.x/my_struct.ex | 69 ++- .../generator_spec_elixir/test.x/bar.ex | 1 + .../generator_spec_elixir/test.x/base.ex | 439 ++++++++++++++++++ .../generator_spec_elixir/test.x/foo.ex | 1 + .../generator_spec_elixir/test.x/has_stuff.ex | 23 +- .../test.x/lots_of_my_structs.ex | 23 +- .../generator_spec_elixir/test.x/my_struct.ex | 23 +- .../test.x/nested_struct.ex | 23 +- .../generator_spec_elixir/test.x/nester.ex | 57 ++- .../generator_spec_elixir/union.x/base.ex | 439 ++++++++++++++++++ 22 files changed, 4198 insertions(+), 275 deletions(-) create mode 100644 lib/xdrgen/generators/elixir/base.ex create mode 100644 spec/output/generator_spec_elixir/block_comments.x/base.ex create mode 100644 spec/output/generator_spec_elixir/const.x/base.ex create mode 100644 spec/output/generator_spec_elixir/const.x/foo.ex create mode 100644 spec/output/generator_spec_elixir/enum.x/base.ex create mode 100644 spec/output/generator_spec_elixir/nesting.x/base.ex create mode 100644 spec/output/generator_spec_elixir/optional.x/base.ex create mode 100644 spec/output/generator_spec_elixir/struct.x/base.ex create mode 100644 spec/output/generator_spec_elixir/test.x/bar.ex create mode 100644 spec/output/generator_spec_elixir/test.x/base.ex create mode 100644 spec/output/generator_spec_elixir/test.x/foo.ex create mode 100644 spec/output/generator_spec_elixir/union.x/base.ex diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index 9a0d148f4..6f9b5009e 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -4,30 +4,23 @@ class Elixir < Xdrgen::Generators::Base MAX_INT = (2**31) - 1 def generate - path = "#{@namespace}_generated.ex" - out = @output.open(path) - - render_define_block(out) do - out.indent() do - render_definitions(out, @top) - end - end + render_definitions(@top) + render_base_classes end private - def render_definitions(out, node) - node.definitions.each{|n| render_definition out, n } - node.namespaces.each{|n| render_definitions out, n } + def render_definitions(node) + node.definitions.each{|n| render_definition n } + node.namespaces.each{|n| render_definitions n } end - def render_nested_definitions(out, defn) + def render_nested_definitions(defn) return unless defn.respond_to? :nested_definitions - defn.nested_definitions.each{|ndefn| render_definition out, ndefn} + defn.nested_definitions.each{|ndefn| render_definition ndefn} end - def render_definition(out, defn) - render_nested_definitions(out, defn) - render_source_comment(out, defn) + def render_definition(defn) + render_nested_definitions(defn) case defn when AST::Definitions::Struct ; @@ -39,10 +32,8 @@ def render_definition(out, defn) when AST::Definitions::Typedef ; render_typedef defn when AST::Definitions::Const ; - render_const out, defn + render_const defn end - - out.break end def render_source_comment(out, defn) @@ -60,19 +51,7 @@ def render_source_comment(out, defn) EOS end - def render_moduledoc(out) - out.puts <<-EOS.strip_heredoc - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - """ - EOS - out.break - end - - def render_moduledoc_enum_type(out, type) + def render_moduledoc(out, type) out.puts <<-EOS.strip_heredoc @moduledoc """ Automatically generated by xdrgen @@ -87,21 +66,10 @@ def render_moduledoc_enum_type(out, type) out.puts "@behaviour XDR.Declaration\n\n" end - def render_define_block(out) - out.puts "defmodule #{@namespace} do" - out.indent do - render_moduledoc(out) - end - yield - ensure - out.puts "end" - out.break - end - - def render_define_block_enum_type(out, module_name) + def render_define_block(out, module_name) out.puts "defmodule #{@namespace}.#{module_name.upcase_first} do" out.indent do - render_moduledoc_enum_type(out, module_name) + render_moduledoc(out, module_name) end yield ensure @@ -113,7 +81,7 @@ def render_typedef(typedef) file_name = "#{typedef.name.downcase}.ex" out = @output.open(file_name) - render_define_block_enum_type(out, typedef.name.downcase) do + render_define_block(out, typedef.name.downcase) do out.indent do build_typedef(out, typedef) end @@ -121,7 +89,10 @@ def render_typedef(typedef) out.close end - def render_const(out, const) + def render_const(const) + file_name = "#{const.name.underscore.downcase}.ex" + out = @output.open(file_name) + out.puts "define_type(\"#{const_name const}\", Const, #{const.value});" end @@ -129,59 +100,59 @@ def render_struct(struct) file_name = "#{struct.name.underscore.downcase}.ex" out = @output.open(file_name) - render_define_block_enum_type(out, struct.name) do + render_define_block(out, struct.name) do out.indent do alias_namespace = "alias #{@namespace}.{" - struct.members.each_with_index do |m, i| + struct.members.each_with_index do |m, i| alias_namespace += "#{type_reference m, m.name.camelize}#{comma_and_space_unless_last(i, struct.members)}" - end + end alias_namespace += "} \n\n" out.puts alias_namespace out.puts "@struct_spec XDR.Struct.new(" out.indent do struct.members.each_with_index do |m, i| - out.puts "#{m.name}: #{type_reference m, m.name.camelize}#{comma_unless_last(i, struct.members)}" + out.puts "#{m.name.underscore.downcase}: #{type_reference m, m.name.camelize}#{comma_unless_last(i, struct.members)}" end end out.puts ")\n\n" struct.members.each_with_index do |m, i| - out.puts "@type #{m.name} :: #{type_reference m, m.name.camelize}.t()" + out.puts "@type #{m.name.underscore.downcase} :: #{type_reference m, m.name.camelize}.t()" end out.puts "\n" types = "@type t :: %__MODULE__{" struct.members.each_with_index do |m, i| - types += "#{m.name}: #{m.name}()#{comma_and_space_unless_last(i, struct.members)}" + types += "#{m.name.underscore.downcase}: #{m.name.underscore.downcase}()#{comma_and_space_unless_last(i, struct.members)}" end types += "}\n\n" out.puts types def_struct = "defstruct [" struct.members.each_with_index do |m, i| - def_struct += ":#{m.name}#{comma_and_space_unless_last(i, struct.members)}" + def_struct += ":#{m.name.underscore.downcase}#{comma_and_space_unless_last(i, struct.members)}" end def_struct += "]\n\n" out.puts def_struct spec = "@spec new(" struct.members.each_with_index do |m, i| - spec += "#{m.name} :: #{m.name}()#{comma_and_space_unless_last(i, struct.members)}" + spec += "#{m.name.underscore.downcase} :: #{m.name.underscore.downcase}()#{comma_and_space_unless_last(i, struct.members)}" end - spec += ") :: t()\n\n" + spec += ") :: t()\n" out.puts spec - out.puts "def new(\n" + out.puts "def new(" out.indent do struct.members.each_with_index do |m, i| - out.puts "%#{type_reference m, m.name.camelize}{} = #{m.name}#{comma_unless_last(i, struct.members)}" + out.puts "%#{type_reference m, m.name.camelize}{} = #{m.name.underscore.downcase}#{comma_unless_last(i, struct.members)}" end end out.puts "),\n" function = "do: %__MODULE__{" struct.members.each_with_index do |m, i| - function += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + function += "#{m.name.underscore.downcase}: #{m.name.underscore.downcase}#{comma_and_space_unless_last(i, struct.members)}" end function += "}\n\n" out.puts function @@ -189,60 +160,58 @@ def render_struct(struct) out.puts "@impl true\n" impl = "def encode_xdr(%__MODULE__{" struct.members.each_with_index do |m, i| - impl += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + impl += "#{m.name.underscore.downcase}: #{m.name.underscore.downcase}#{comma_and_space_unless_last(i, struct.members)}" end - impl += "}) do \n" + impl += "}) do\n" out.puts impl args = "[" out.indent do struct.members.each_with_index do |m, i| - args += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + args += "#{m.name.underscore.downcase}: #{m.name.underscore.downcase}#{comma_and_space_unless_last(i, struct.members)}" end args += "]\n" out.puts args - out.puts "|> XDR.Struct.new()" out.puts "|> XDR.Struct.encode_xdr()" end - out.puts "end \n\n" + out.puts "end\n\n" out.puts "@impl true\n" impl = "def encode_xdr!(%__MODULE__{" struct.members.each_with_index do |m, i| - impl += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + impl += "#{m.name.underscore.downcase}: #{m.name.underscore.downcase}#{comma_and_space_unless_last(i, struct.members)}" end - impl += "}) do \n" + impl += "}) do\n" out.puts impl args = "[" out.indent do struct.members.each_with_index do |m, i| - args += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" + args += "#{m.name.underscore.downcase}: #{m.name.underscore.downcase}#{comma_and_space_unless_last(i, struct.members)}" end args += "]\n" out.puts args - out.puts "|> XDR.Struct.new()" out.puts "|> XDR.Struct.encode_xdr!()" end - out.puts "end \n\n" + out.puts "end\n\n" - out.puts "@impl true \n" - out.puts "def decode_xdr(bytes, struct \\\\ @struct_spec) \n\n" + out.puts "@impl true\n" + out.puts "def decode_xdr(bytes, struct \\\\ @struct_spec)\n\n" out.puts "def decode_xdr(bytes, struct) do" out.indent do out.puts "case XDR.Struct.decode_xdr(bytes, struct) do" out.indent do comp = "{:ok, {%XDR.Struct{components: [" - struct.members.each_with_index do |m, i| - comp += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" - end - comp += "]}, rest}} -> \n" + struct.members.each_with_index do |m, i| + comp += "#{m.name.underscore.downcase}: #{m.name.underscore.downcase}#{comma_and_space_unless_last(i, struct.members)}" + end + comp += "]}, rest}} ->\n" out.puts comp out.indent do new_comp = "{:ok, {new(" struct.members.each_with_index do |m, i| - new_comp += "#{m.name}#{comma_and_space_unless_last(i, struct.members)}" + new_comp += "#{m.name.underscore.downcase}#{comma_and_space_unless_last(i, struct.members)}" end new_comp += "), rest}}" out.puts new_comp @@ -251,26 +220,26 @@ def render_struct(struct) end out.puts "end" end - out.puts "end \n\n" + out.puts "end\n\n" - out.puts "@impl true \n" - out.puts "def decode_xdr!(bytes, struct \\\\ @struct_spec) \n\n" + out.puts "@impl true\n" + out.puts "def decode_xdr!(bytes, struct \\\\ @struct_spec)\n\n" out.puts "def decode_xdr!(bytes, struct) do" out.indent do comp = "{%XDR.Struct{components: [" - struct.members.each_with_index do |m, i| - comp += "#{m.name}: #{m.name}#{comma_and_space_unless_last(i, struct.members)}" - end - comp += "]}, rest} = \n" + struct.members.each_with_index do |m, i| + comp += "#{m.name.underscore.downcase}: #{m.name.underscore.downcase}#{comma_and_space_unless_last(i, struct.members)}" + end + comp += "]}, rest} =\n" out.puts comp out.indent do out.puts "XDR.Struct.decode_xdr!(bytes, struct)" end new_comp = "{new(" - struct.members.each_with_index do |m, i| - new_comp += "#{m.name}#{comma_and_space_unless_last(i, struct.members)}" - end + struct.members.each_with_index do |m, i| + new_comp += "#{m.name.underscore.downcase}#{comma_and_space_unless_last(i, struct.members)}" + end new_comp += "), rest}" out.puts new_comp end @@ -284,7 +253,7 @@ def render_enum(enum) file_name = "#{enum.name.underscore.downcase}.ex" out = @output.open(file_name) - render_define_block_enum_type(out, enum.name) do + render_define_block(out, enum.name) do out.indent do out.puts "@declarations [\n" out.indent do @@ -354,7 +323,7 @@ def render_union(union) union_name_camelize = union.name.camelize union_discriminant = union.discriminant - render_define_block_enum_type(out, union.name) do + render_define_block(out, union.name) do out.indent do out.puts "alias #{@namespace}.{\n" out.indent do @@ -468,6 +437,15 @@ def render_union(union) end private + def render_base_classes + file_name = "base.ex" + out = @output.open(file_name) + base_py_content = IO.read(__dir__ + "/elixir/base.ex") + new_base_file = base_py_content.gsub("defmodule ", "defmodule #{@namespace}.") + out.puts new_base_file + out.close + end + def name(named) return nil unless named.respond_to?(:name) diff --git a/lib/xdrgen/generators/elixir/base.ex b/lib/xdrgen/generators/elixir/base.ex new file mode 100644 index 000000000..47b124b7b --- /dev/null +++ b/lib/xdrgen/generators/elixir/base.ex @@ -0,0 +1,439 @@ +defmodule Int do + @moduledoc """ + Representation of Stellar `Int` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(int :: integer()) :: t() + def new(int), do: %__MODULE__{datum: int} + + @impl true + def encode_xdr(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr(%XDR.Int{datum: int}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: int}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: int}, rest}} -> {:ok, {new(int), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: int}, rest} = XDR.Int.decode_xdr!(bytes) + {new(int), rest} + end +end + +defmodule UInt do + @moduledoc """ + Representation of Stellar `UInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr(%XDR.UInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr!(%XDR.UInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.UInt.decode_xdr(bytes) do + {:ok, {%XDR.UInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.UInt{datum: uint}, rest} = XDR.UInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule Float do + @moduledoc """ + Representation of Stellar `Float` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr(%XDR.Float{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Float.decode_xdr(bytes) do + {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule DoubleFloat do + @moduledoc """ + Representation of Stellar `DoubleFloat` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.DoubleFloat.decode_xdr(bytes) do + {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule HyperUInt do + @moduledoc """ + Representation of Stellar `HyperUInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr!(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperUInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperUInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperUInt{datum: uint}, rest} = XDR.HyperUInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule Bool do + @moduledoc """ + Representation of Stellar `Bool` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: boolean()} + + defstruct [:value] + + @spec new(value :: boolean()) :: t() + def new(val), do: %__MODULE__{value: val} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr(%XDR.Bool{identifier: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr!(%XDR.Bool{identifier: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Bool.decode_xdr(bytes) do + {:ok, {%XDR.Bool{identifier: val}, rest}} -> {:ok, {new(val), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Bool{identifier: val}, rest} = XDR.Bool.decode_xdr!(bytes) + {new(val), rest} + end +end + +defmodule String do + @moduledoc """ + Representation of Stellar `String` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end +end + +defmodule FixedOpaque do + @moduledoc """ + Representation of Stellar `FixedOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length = 4_294_967_295 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule VariableOpaque do + @moduledoc """ + Representation of Stellar `VariableOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @opaque_spec XDR.VariableOpaque.new(nil) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr!(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.VariableOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule Void do + @moduledoc """ + Representation of Stellar `Void` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: nil} + + defstruct [:value] + + @spec new(value :: nil) :: t() + def new(_val \\ nil), do: %__MODULE__{value: nil} + + @impl true + def encode_xdr(%__MODULE__{}) do + XDR.Void.encode_xdr(%XDR.Void{}) + end + + @impl true + def encode_xdr!(%__MODULE__{}) do + XDR.Void.encode_xdr!(%XDR.Void{}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Void.decode_xdr(bytes) do + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {nil, rest} = XDR.Void.decode_xdr!(bytes) + {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/block_comments.x/base.ex b/spec/output/generator_spec_elixir/block_comments.x/base.ex new file mode 100644 index 000000000..d54324fd3 --- /dev/null +++ b/spec/output/generator_spec_elixir/block_comments.x/base.ex @@ -0,0 +1,439 @@ +defmodule MyXDR.Int do + @moduledoc """ + Representation of Stellar `Int` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(int :: integer()) :: t() + def new(int), do: %__MODULE__{datum: int} + + @impl true + def encode_xdr(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr(%XDR.Int{datum: int}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: int}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: int}, rest}} -> {:ok, {new(int), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: int}, rest} = XDR.Int.decode_xdr!(bytes) + {new(int), rest} + end +end + +defmodule MyXDR.UInt do + @moduledoc """ + Representation of Stellar `UInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr(%XDR.UInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr!(%XDR.UInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.UInt.decode_xdr(bytes) do + {:ok, {%XDR.UInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.UInt{datum: uint}, rest} = XDR.UInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Float do + @moduledoc """ + Representation of Stellar `Float` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr(%XDR.Float{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Float.decode_xdr(bytes) do + {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.DoubleFloat do + @moduledoc """ + Representation of Stellar `DoubleFloat` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.DoubleFloat.decode_xdr(bytes) do + {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.HyperUInt do + @moduledoc """ + Representation of Stellar `HyperUInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr!(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperUInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperUInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperUInt{datum: uint}, rest} = XDR.HyperUInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Bool do + @moduledoc """ + Representation of Stellar `Bool` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: boolean()} + + defstruct [:value] + + @spec new(value :: boolean()) :: t() + def new(val), do: %__MODULE__{value: val} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr(%XDR.Bool{identifier: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr!(%XDR.Bool{identifier: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Bool.decode_xdr(bytes) do + {:ok, {%XDR.Bool{identifier: val}, rest}} -> {:ok, {new(val), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Bool{identifier: val}, rest} = XDR.Bool.decode_xdr!(bytes) + {new(val), rest} + end +end + +defmodule MyXDR.String do + @moduledoc """ + Representation of Stellar `String` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end +end + +defmodule MyXDR.FixedOpaque do + @moduledoc """ + Representation of Stellar `FixedOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length = 4_294_967_295 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.VariableOpaque do + @moduledoc """ + Representation of Stellar `VariableOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @opaque_spec XDR.VariableOpaque.new(nil) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr!(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.VariableOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.Void do + @moduledoc """ + Representation of Stellar `Void` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: nil} + + defstruct [:value] + + @spec new(value :: nil) :: t() + def new(_val \\ nil), do: %__MODULE__{value: nil} + + @impl true + def encode_xdr(%__MODULE__{}) do + XDR.Void.encode_xdr(%XDR.Void{}) + end + + @impl true + def encode_xdr!(%__MODULE__{}) do + XDR.Void.encode_xdr!(%XDR.Void{}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Void.decode_xdr(bytes) do + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {nil, rest} = XDR.Void.decode_xdr!(bytes) + {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/const.x/base.ex b/spec/output/generator_spec_elixir/const.x/base.ex new file mode 100644 index 000000000..d54324fd3 --- /dev/null +++ b/spec/output/generator_spec_elixir/const.x/base.ex @@ -0,0 +1,439 @@ +defmodule MyXDR.Int do + @moduledoc """ + Representation of Stellar `Int` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(int :: integer()) :: t() + def new(int), do: %__MODULE__{datum: int} + + @impl true + def encode_xdr(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr(%XDR.Int{datum: int}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: int}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: int}, rest}} -> {:ok, {new(int), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: int}, rest} = XDR.Int.decode_xdr!(bytes) + {new(int), rest} + end +end + +defmodule MyXDR.UInt do + @moduledoc """ + Representation of Stellar `UInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr(%XDR.UInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr!(%XDR.UInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.UInt.decode_xdr(bytes) do + {:ok, {%XDR.UInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.UInt{datum: uint}, rest} = XDR.UInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Float do + @moduledoc """ + Representation of Stellar `Float` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr(%XDR.Float{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Float.decode_xdr(bytes) do + {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.DoubleFloat do + @moduledoc """ + Representation of Stellar `DoubleFloat` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.DoubleFloat.decode_xdr(bytes) do + {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.HyperUInt do + @moduledoc """ + Representation of Stellar `HyperUInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr!(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperUInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperUInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperUInt{datum: uint}, rest} = XDR.HyperUInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Bool do + @moduledoc """ + Representation of Stellar `Bool` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: boolean()} + + defstruct [:value] + + @spec new(value :: boolean()) :: t() + def new(val), do: %__MODULE__{value: val} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr(%XDR.Bool{identifier: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr!(%XDR.Bool{identifier: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Bool.decode_xdr(bytes) do + {:ok, {%XDR.Bool{identifier: val}, rest}} -> {:ok, {new(val), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Bool{identifier: val}, rest} = XDR.Bool.decode_xdr!(bytes) + {new(val), rest} + end +end + +defmodule MyXDR.String do + @moduledoc """ + Representation of Stellar `String` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end +end + +defmodule MyXDR.FixedOpaque do + @moduledoc """ + Representation of Stellar `FixedOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length = 4_294_967_295 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.VariableOpaque do + @moduledoc """ + Representation of Stellar `VariableOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @opaque_spec XDR.VariableOpaque.new(nil) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr!(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.VariableOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.Void do + @moduledoc """ + Representation of Stellar `Void` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: nil} + + defstruct [:value] + + @spec new(value :: nil) :: t() + def new(_val \\ nil), do: %__MODULE__{value: nil} + + @impl true + def encode_xdr(%__MODULE__{}) do + XDR.Void.encode_xdr(%XDR.Void{}) + end + + @impl true + def encode_xdr!(%__MODULE__{}) do + XDR.Void.encode_xdr!(%XDR.Void{}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Void.decode_xdr(bytes) do + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {nil, rest} = XDR.Void.decode_xdr!(bytes) + {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/const.x/foo.ex b/spec/output/generator_spec_elixir/const.x/foo.ex new file mode 100644 index 000000000..1685f04ae --- /dev/null +++ b/spec/output/generator_spec_elixir/const.x/foo.ex @@ -0,0 +1 @@ +define_type("FOO", Const, 1); diff --git a/spec/output/generator_spec_elixir/enum.x/base.ex b/spec/output/generator_spec_elixir/enum.x/base.ex new file mode 100644 index 000000000..d54324fd3 --- /dev/null +++ b/spec/output/generator_spec_elixir/enum.x/base.ex @@ -0,0 +1,439 @@ +defmodule MyXDR.Int do + @moduledoc """ + Representation of Stellar `Int` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(int :: integer()) :: t() + def new(int), do: %__MODULE__{datum: int} + + @impl true + def encode_xdr(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr(%XDR.Int{datum: int}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: int}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: int}, rest}} -> {:ok, {new(int), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: int}, rest} = XDR.Int.decode_xdr!(bytes) + {new(int), rest} + end +end + +defmodule MyXDR.UInt do + @moduledoc """ + Representation of Stellar `UInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr(%XDR.UInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr!(%XDR.UInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.UInt.decode_xdr(bytes) do + {:ok, {%XDR.UInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.UInt{datum: uint}, rest} = XDR.UInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Float do + @moduledoc """ + Representation of Stellar `Float` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr(%XDR.Float{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Float.decode_xdr(bytes) do + {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.DoubleFloat do + @moduledoc """ + Representation of Stellar `DoubleFloat` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.DoubleFloat.decode_xdr(bytes) do + {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.HyperUInt do + @moduledoc """ + Representation of Stellar `HyperUInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr!(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperUInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperUInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperUInt{datum: uint}, rest} = XDR.HyperUInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Bool do + @moduledoc """ + Representation of Stellar `Bool` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: boolean()} + + defstruct [:value] + + @spec new(value :: boolean()) :: t() + def new(val), do: %__MODULE__{value: val} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr(%XDR.Bool{identifier: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr!(%XDR.Bool{identifier: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Bool.decode_xdr(bytes) do + {:ok, {%XDR.Bool{identifier: val}, rest}} -> {:ok, {new(val), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Bool{identifier: val}, rest} = XDR.Bool.decode_xdr!(bytes) + {new(val), rest} + end +end + +defmodule MyXDR.String do + @moduledoc """ + Representation of Stellar `String` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end +end + +defmodule MyXDR.FixedOpaque do + @moduledoc """ + Representation of Stellar `FixedOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length = 4_294_967_295 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.VariableOpaque do + @moduledoc """ + Representation of Stellar `VariableOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @opaque_spec XDR.VariableOpaque.new(nil) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr!(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.VariableOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.Void do + @moduledoc """ + Representation of Stellar `Void` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: nil} + + defstruct [:value] + + @spec new(value :: nil) :: t() + def new(_val \\ nil), do: %__MODULE__{value: nil} + + @impl true + def encode_xdr(%__MODULE__{}) do + XDR.Void.encode_xdr(%XDR.Void{}) + end + + @impl true + def encode_xdr!(%__MODULE__{}) do + XDR.Void.encode_xdr!(%XDR.Void{}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Void.decode_xdr(bytes) do + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {nil, rest} = XDR.Void.decode_xdr!(bytes) + {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/nesting.x/base.ex b/spec/output/generator_spec_elixir/nesting.x/base.ex new file mode 100644 index 000000000..d54324fd3 --- /dev/null +++ b/spec/output/generator_spec_elixir/nesting.x/base.ex @@ -0,0 +1,439 @@ +defmodule MyXDR.Int do + @moduledoc """ + Representation of Stellar `Int` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(int :: integer()) :: t() + def new(int), do: %__MODULE__{datum: int} + + @impl true + def encode_xdr(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr(%XDR.Int{datum: int}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: int}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: int}, rest}} -> {:ok, {new(int), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: int}, rest} = XDR.Int.decode_xdr!(bytes) + {new(int), rest} + end +end + +defmodule MyXDR.UInt do + @moduledoc """ + Representation of Stellar `UInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr(%XDR.UInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr!(%XDR.UInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.UInt.decode_xdr(bytes) do + {:ok, {%XDR.UInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.UInt{datum: uint}, rest} = XDR.UInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Float do + @moduledoc """ + Representation of Stellar `Float` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr(%XDR.Float{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Float.decode_xdr(bytes) do + {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.DoubleFloat do + @moduledoc """ + Representation of Stellar `DoubleFloat` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.DoubleFloat.decode_xdr(bytes) do + {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.HyperUInt do + @moduledoc """ + Representation of Stellar `HyperUInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr!(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperUInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperUInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperUInt{datum: uint}, rest} = XDR.HyperUInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Bool do + @moduledoc """ + Representation of Stellar `Bool` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: boolean()} + + defstruct [:value] + + @spec new(value :: boolean()) :: t() + def new(val), do: %__MODULE__{value: val} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr(%XDR.Bool{identifier: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr!(%XDR.Bool{identifier: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Bool.decode_xdr(bytes) do + {:ok, {%XDR.Bool{identifier: val}, rest}} -> {:ok, {new(val), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Bool{identifier: val}, rest} = XDR.Bool.decode_xdr!(bytes) + {new(val), rest} + end +end + +defmodule MyXDR.String do + @moduledoc """ + Representation of Stellar `String` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end +end + +defmodule MyXDR.FixedOpaque do + @moduledoc """ + Representation of Stellar `FixedOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length = 4_294_967_295 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.VariableOpaque do + @moduledoc """ + Representation of Stellar `VariableOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @opaque_spec XDR.VariableOpaque.new(nil) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr!(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.VariableOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.Void do + @moduledoc """ + Representation of Stellar `Void` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: nil} + + defstruct [:value] + + @spec new(value :: nil) :: t() + def new(_val \\ nil), do: %__MODULE__{value: nil} + + @impl true + def encode_xdr(%__MODULE__{}) do + XDR.Void.encode_xdr(%XDR.Void{}) + end + + @impl true + def encode_xdr!(%__MODULE__{}) do + XDR.Void.encode_xdr!(%XDR.Void{}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Void.decode_xdr(bytes) do + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {nil, rest} = XDR.Void.decode_xdr!(bytes) + {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/nesting.x/one.ex b/spec/output/generator_spec_elixir/nesting.x/one.ex index 79ef4a257..4229111cf 100644 --- a/spec/output/generator_spec_elixir/nesting.x/one.ex +++ b/spec/output/generator_spec_elixir/nesting.x/one.ex @@ -13,53 +13,52 @@ defmodule MyXDR.One do alias MyXDR.{Int} @struct_spec XDR.Struct.new( - someInt: Int + some_int: Int ) - @type someInt :: Int.t() + @type some_int :: Int.t() - @type t :: %__MODULE__{someInt: someInt()} + @type t :: %__MODULE__{some_int: some_int()} - defstruct [:someInt] - - @spec new(someInt :: someInt()) :: t() + defstruct [:some_int] + @spec new(some_int :: some_int()) :: t() def new( - %Int{} = someInt + %Int{} = some_int ), - do: %__MODULE__{someInt: someInt} + do: %__MODULE__{some_int: some_int} @impl true - def encode_xdr(%__MODULE__{someInt: someInt}) do - [someInt: someInt] + def encode_xdr(%__MODULE__{some_int: some_int}) do + [some_int: some_int] |> XDR.Struct.new() |> XDR.Struct.encode_xdr() - end + end @impl true - def encode_xdr!(%__MODULE__{someInt: someInt}) do - [someInt: someInt] + def encode_xdr!(%__MODULE__{some_int: some_int}) do + [some_int: some_int] |> XDR.Struct.new() |> XDR.Struct.encode_xdr!() - end + end - @impl true - def decode_xdr(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) def decode_xdr(bytes, struct) do case XDR.Struct.decode_xdr(bytes, struct) do - {:ok, {%XDR.Struct{components: [someInt: someInt]}, rest}} -> - {:ok, {new(someInt), rest}} + {:ok, {%XDR.Struct{components: [some_int: some_int]}, rest}} -> + {:ok, {new(some_int), rest}} error -> error end - end + end - @impl true - def decode_xdr!(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) def decode_xdr!(bytes, struct) do - {%XDR.Struct{components: [someInt: someInt]}, rest} = + {%XDR.Struct{components: [some_int: some_int]}, rest} = XDR.Struct.decode_xdr!(bytes, struct) - {new(someInt), rest} + {new(some_int), rest} end end diff --git a/spec/output/generator_spec_elixir/nesting.x/two.ex b/spec/output/generator_spec_elixir/nesting.x/two.ex index ded012ff3..e335c6dea 100644 --- a/spec/output/generator_spec_elixir/nesting.x/two.ex +++ b/spec/output/generator_spec_elixir/nesting.x/two.ex @@ -13,56 +13,55 @@ defmodule MyXDR.Two do alias MyXDR.{Int, Foo} @struct_spec XDR.Struct.new( - someInt: Int, + some_int: Int, foo: Foo ) - @type someInt :: Int.t() + @type some_int :: Int.t() @type foo :: Foo.t() - @type t :: %__MODULE__{someInt: someInt(), foo: foo()} + @type t :: %__MODULE__{some_int: some_int(), foo: foo()} - defstruct [:someInt, :foo] - - @spec new(someInt :: someInt(), foo :: foo()) :: t() + defstruct [:some_int, :foo] + @spec new(some_int :: some_int(), foo :: foo()) :: t() def new( - %Int{} = someInt, + %Int{} = some_int, %Foo{} = foo ), - do: %__MODULE__{someInt: someInt, foo: foo} + do: %__MODULE__{some_int: some_int, foo: foo} @impl true - def encode_xdr(%__MODULE__{someInt: someInt, foo: foo}) do - [someInt: someInt, foo: foo] + def encode_xdr(%__MODULE__{some_int: some_int, foo: foo}) do + [some_int: some_int, foo: foo] |> XDR.Struct.new() |> XDR.Struct.encode_xdr() - end + end @impl true - def encode_xdr!(%__MODULE__{someInt: someInt, foo: foo}) do - [someInt: someInt, foo: foo] + def encode_xdr!(%__MODULE__{some_int: some_int, foo: foo}) do + [some_int: some_int, foo: foo] |> XDR.Struct.new() |> XDR.Struct.encode_xdr!() - end + end - @impl true - def decode_xdr(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) def decode_xdr(bytes, struct) do case XDR.Struct.decode_xdr(bytes, struct) do - {:ok, {%XDR.Struct{components: [someInt: someInt, foo: foo]}, rest}} -> - {:ok, {new(someInt, foo), rest}} + {:ok, {%XDR.Struct{components: [some_int: some_int, foo: foo]}, rest}} -> + {:ok, {new(some_int, foo), rest}} error -> error end - end + end - @impl true - def decode_xdr!(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) def decode_xdr!(bytes, struct) do - {%XDR.Struct{components: [someInt: someInt, foo: foo]}, rest} = + {%XDR.Struct{components: [some_int: some_int, foo: foo]}, rest} = XDR.Struct.decode_xdr!(bytes, struct) - {new(someInt, foo), rest} + {new(some_int, foo), rest} end end diff --git a/spec/output/generator_spec_elixir/optional.x/base.ex b/spec/output/generator_spec_elixir/optional.x/base.ex new file mode 100644 index 000000000..d54324fd3 --- /dev/null +++ b/spec/output/generator_spec_elixir/optional.x/base.ex @@ -0,0 +1,439 @@ +defmodule MyXDR.Int do + @moduledoc """ + Representation of Stellar `Int` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(int :: integer()) :: t() + def new(int), do: %__MODULE__{datum: int} + + @impl true + def encode_xdr(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr(%XDR.Int{datum: int}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: int}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: int}, rest}} -> {:ok, {new(int), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: int}, rest} = XDR.Int.decode_xdr!(bytes) + {new(int), rest} + end +end + +defmodule MyXDR.UInt do + @moduledoc """ + Representation of Stellar `UInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr(%XDR.UInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr!(%XDR.UInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.UInt.decode_xdr(bytes) do + {:ok, {%XDR.UInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.UInt{datum: uint}, rest} = XDR.UInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Float do + @moduledoc """ + Representation of Stellar `Float` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr(%XDR.Float{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Float.decode_xdr(bytes) do + {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.DoubleFloat do + @moduledoc """ + Representation of Stellar `DoubleFloat` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.DoubleFloat.decode_xdr(bytes) do + {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.HyperUInt do + @moduledoc """ + Representation of Stellar `HyperUInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr!(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperUInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperUInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperUInt{datum: uint}, rest} = XDR.HyperUInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Bool do + @moduledoc """ + Representation of Stellar `Bool` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: boolean()} + + defstruct [:value] + + @spec new(value :: boolean()) :: t() + def new(val), do: %__MODULE__{value: val} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr(%XDR.Bool{identifier: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr!(%XDR.Bool{identifier: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Bool.decode_xdr(bytes) do + {:ok, {%XDR.Bool{identifier: val}, rest}} -> {:ok, {new(val), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Bool{identifier: val}, rest} = XDR.Bool.decode_xdr!(bytes) + {new(val), rest} + end +end + +defmodule MyXDR.String do + @moduledoc """ + Representation of Stellar `String` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end +end + +defmodule MyXDR.FixedOpaque do + @moduledoc """ + Representation of Stellar `FixedOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length = 4_294_967_295 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.VariableOpaque do + @moduledoc """ + Representation of Stellar `VariableOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @opaque_spec XDR.VariableOpaque.new(nil) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr!(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.VariableOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.Void do + @moduledoc """ + Representation of Stellar `Void` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: nil} + + defstruct [:value] + + @spec new(value :: nil) :: t() + def new(_val \\ nil), do: %__MODULE__{value: nil} + + @impl true + def encode_xdr(%__MODULE__{}) do + XDR.Void.encode_xdr(%XDR.Void{}) + end + + @impl true + def encode_xdr!(%__MODULE__{}) do + XDR.Void.encode_xdr!(%XDR.Void{}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Void.decode_xdr(bytes) do + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {nil, rest} = XDR.Void.decode_xdr!(bytes) + {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/optional.x/has_options.ex b/spec/output/generator_spec_elixir/optional.x/has_options.ex index ef49f0e68..32c5d2cc3 100644 --- a/spec/output/generator_spec_elixir/optional.x/has_options.ex +++ b/spec/output/generator_spec_elixir/optional.x/has_options.ex @@ -13,59 +13,58 @@ defmodule MyXDR.HasOptions do alias MyXDR.{OptionalInt, OptionalInt, OptionalArr} @struct_spec XDR.Struct.new( - firstOption: OptionalInt, - secondOption: OptionalInt, - thirdOption: OptionalArr + first_option: OptionalInt, + second_option: OptionalInt, + third_option: OptionalArr ) - @type firstOption :: OptionalInt.t() - @type secondOption :: OptionalInt.t() - @type thirdOption :: OptionalArr.t() + @type first_option :: OptionalInt.t() + @type second_option :: OptionalInt.t() + @type third_option :: OptionalArr.t() - @type t :: %__MODULE__{firstOption: firstOption(), secondOption: secondOption(), thirdOption: thirdOption()} + @type t :: %__MODULE__{first_option: first_option(), second_option: second_option(), third_option: third_option()} - defstruct [:firstOption, :secondOption, :thirdOption] - - @spec new(firstOption :: firstOption(), secondOption :: secondOption(), thirdOption :: thirdOption()) :: t() + defstruct [:first_option, :second_option, :third_option] + @spec new(first_option :: first_option(), second_option :: second_option(), third_option :: third_option()) :: t() def new( - %OptionalInt{} = firstOption, - %OptionalInt{} = secondOption, - %OptionalArr{} = thirdOption + %OptionalInt{} = first_option, + %OptionalInt{} = second_option, + %OptionalArr{} = third_option ), - do: %__MODULE__{firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption} + do: %__MODULE__{first_option: first_option, second_option: second_option, third_option: third_option} @impl true - def encode_xdr(%__MODULE__{firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption}) do - [firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption] + def encode_xdr(%__MODULE__{first_option: first_option, second_option: second_option, third_option: third_option}) do + [first_option: first_option, second_option: second_option, third_option: third_option] |> XDR.Struct.new() |> XDR.Struct.encode_xdr() - end + end @impl true - def encode_xdr!(%__MODULE__{firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption}) do - [firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption] + def encode_xdr!(%__MODULE__{first_option: first_option, second_option: second_option, third_option: third_option}) do + [first_option: first_option, second_option: second_option, third_option: third_option] |> XDR.Struct.new() |> XDR.Struct.encode_xdr!() - end + end - @impl true - def decode_xdr(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) def decode_xdr(bytes, struct) do case XDR.Struct.decode_xdr(bytes, struct) do - {:ok, {%XDR.Struct{components: [firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption]}, rest}} -> - {:ok, {new(firstOption, secondOption, thirdOption), rest}} + {:ok, {%XDR.Struct{components: [first_option: first_option, second_option: second_option, third_option: third_option]}, rest}} -> + {:ok, {new(first_option, second_option, third_option), rest}} error -> error end - end + end - @impl true - def decode_xdr!(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) def decode_xdr!(bytes, struct) do - {%XDR.Struct{components: [firstOption: firstOption, secondOption: secondOption, thirdOption: thirdOption]}, rest} = + {%XDR.Struct{components: [first_option: first_option, second_option: second_option, third_option: third_option]}, rest} = XDR.Struct.decode_xdr!(bytes, struct) - {new(firstOption, secondOption, thirdOption), rest} + {new(first_option, second_option, third_option), rest} end end diff --git a/spec/output/generator_spec_elixir/struct.x/base.ex b/spec/output/generator_spec_elixir/struct.x/base.ex new file mode 100644 index 000000000..d54324fd3 --- /dev/null +++ b/spec/output/generator_spec_elixir/struct.x/base.ex @@ -0,0 +1,439 @@ +defmodule MyXDR.Int do + @moduledoc """ + Representation of Stellar `Int` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(int :: integer()) :: t() + def new(int), do: %__MODULE__{datum: int} + + @impl true + def encode_xdr(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr(%XDR.Int{datum: int}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: int}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: int}, rest}} -> {:ok, {new(int), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: int}, rest} = XDR.Int.decode_xdr!(bytes) + {new(int), rest} + end +end + +defmodule MyXDR.UInt do + @moduledoc """ + Representation of Stellar `UInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr(%XDR.UInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr!(%XDR.UInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.UInt.decode_xdr(bytes) do + {:ok, {%XDR.UInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.UInt{datum: uint}, rest} = XDR.UInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Float do + @moduledoc """ + Representation of Stellar `Float` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr(%XDR.Float{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Float.decode_xdr(bytes) do + {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.DoubleFloat do + @moduledoc """ + Representation of Stellar `DoubleFloat` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.DoubleFloat.decode_xdr(bytes) do + {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.HyperUInt do + @moduledoc """ + Representation of Stellar `HyperUInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr!(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperUInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperUInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperUInt{datum: uint}, rest} = XDR.HyperUInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Bool do + @moduledoc """ + Representation of Stellar `Bool` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: boolean()} + + defstruct [:value] + + @spec new(value :: boolean()) :: t() + def new(val), do: %__MODULE__{value: val} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr(%XDR.Bool{identifier: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr!(%XDR.Bool{identifier: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Bool.decode_xdr(bytes) do + {:ok, {%XDR.Bool{identifier: val}, rest}} -> {:ok, {new(val), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Bool{identifier: val}, rest} = XDR.Bool.decode_xdr!(bytes) + {new(val), rest} + end +end + +defmodule MyXDR.String do + @moduledoc """ + Representation of Stellar `String` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end +end + +defmodule MyXDR.FixedOpaque do + @moduledoc """ + Representation of Stellar `FixedOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length = 4_294_967_295 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.VariableOpaque do + @moduledoc """ + Representation of Stellar `VariableOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @opaque_spec XDR.VariableOpaque.new(nil) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr!(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.VariableOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.Void do + @moduledoc """ + Representation of Stellar `Void` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: nil} + + defstruct [:value] + + @spec new(value :: nil) :: t() + def new(_val \\ nil), do: %__MODULE__{value: nil} + + @impl true + def encode_xdr(%__MODULE__{}) do + XDR.Void.encode_xdr(%XDR.Void{}) + end + + @impl true + def encode_xdr!(%__MODULE__{}) do + XDR.Void.encode_xdr!(%XDR.Void{}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Void.decode_xdr(bytes) do + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {nil, rest} = XDR.Void.decode_xdr!(bytes) + {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/struct.x/my_struct.ex b/spec/output/generator_spec_elixir/struct.x/my_struct.ex index ebcda295d..586b57e9c 100644 --- a/spec/output/generator_spec_elixir/struct.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/struct.x/my_struct.ex @@ -13,65 +13,64 @@ defmodule MyXDR.MyStruct do alias MyXDR.{Int, Int64, FixedOpaque10, String, String100} @struct_spec XDR.Struct.new( - someInt: Int, - aBigInt: Int64, - someOpaque: FixedOpaque10, - someString: String, - maxString: String100 + some_int: Int, + a_big_int: Int64, + some_opaque: FixedOpaque10, + some_string: String, + max_string: String100 ) - @type someInt :: Int.t() - @type aBigInt :: Int64.t() - @type someOpaque :: FixedOpaque10.t() - @type someString :: String.t() - @type maxString :: String100.t() + @type some_int :: Int.t() + @type a_big_int :: Int64.t() + @type some_opaque :: FixedOpaque10.t() + @type some_string :: String.t() + @type max_string :: String100.t() - @type t :: %__MODULE__{someInt: someInt(), aBigInt: aBigInt(), someOpaque: someOpaque(), someString: someString(), maxString: maxString()} + @type t :: %__MODULE__{some_int: some_int(), a_big_int: a_big_int(), some_opaque: some_opaque(), some_string: some_string(), max_string: max_string()} - defstruct [:someInt, :aBigInt, :someOpaque, :someString, :maxString] - - @spec new(someInt :: someInt(), aBigInt :: aBigInt(), someOpaque :: someOpaque(), someString :: someString(), maxString :: maxString()) :: t() + defstruct [:some_int, :a_big_int, :some_opaque, :some_string, :max_string] + @spec new(some_int :: some_int(), a_big_int :: a_big_int(), some_opaque :: some_opaque(), some_string :: some_string(), max_string :: max_string()) :: t() def new( - %Int{} = someInt, - %Int64{} = aBigInt, - %FixedOpaque10{} = someOpaque, - %String{} = someString, - %String100{} = maxString + %Int{} = some_int, + %Int64{} = a_big_int, + %FixedOpaque10{} = some_opaque, + %String{} = some_string, + %String100{} = max_string ), - do: %__MODULE__{someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString} + do: %__MODULE__{some_int: some_int, a_big_int: a_big_int, some_opaque: some_opaque, some_string: some_string, max_string: max_string} @impl true - def encode_xdr(%__MODULE__{someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString}) do - [someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString] + def encode_xdr(%__MODULE__{some_int: some_int, a_big_int: a_big_int, some_opaque: some_opaque, some_string: some_string, max_string: max_string}) do + [some_int: some_int, a_big_int: a_big_int, some_opaque: some_opaque, some_string: some_string, max_string: max_string] |> XDR.Struct.new() |> XDR.Struct.encode_xdr() - end + end @impl true - def encode_xdr!(%__MODULE__{someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString}) do - [someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString] + def encode_xdr!(%__MODULE__{some_int: some_int, a_big_int: a_big_int, some_opaque: some_opaque, some_string: some_string, max_string: max_string}) do + [some_int: some_int, a_big_int: a_big_int, some_opaque: some_opaque, some_string: some_string, max_string: max_string] |> XDR.Struct.new() |> XDR.Struct.encode_xdr!() - end + end - @impl true - def decode_xdr(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) def decode_xdr(bytes, struct) do case XDR.Struct.decode_xdr(bytes, struct) do - {:ok, {%XDR.Struct{components: [someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString]}, rest}} -> - {:ok, {new(someInt, aBigInt, someOpaque, someString, maxString), rest}} + {:ok, {%XDR.Struct{components: [some_int: some_int, a_big_int: a_big_int, some_opaque: some_opaque, some_string: some_string, max_string: max_string]}, rest}} -> + {:ok, {new(some_int, a_big_int, some_opaque, some_string, max_string), rest}} error -> error end - end + end - @impl true - def decode_xdr!(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) def decode_xdr!(bytes, struct) do - {%XDR.Struct{components: [someInt: someInt, aBigInt: aBigInt, someOpaque: someOpaque, someString: someString, maxString: maxString]}, rest} = + {%XDR.Struct{components: [some_int: some_int, a_big_int: a_big_int, some_opaque: some_opaque, some_string: some_string, max_string: max_string]}, rest} = XDR.Struct.decode_xdr!(bytes, struct) - {new(someInt, aBigInt, someOpaque, someString, maxString), rest} + {new(some_int, a_big_int, some_opaque, some_string, max_string), rest} end end diff --git a/spec/output/generator_spec_elixir/test.x/bar.ex b/spec/output/generator_spec_elixir/test.x/bar.ex new file mode 100644 index 000000000..1a8179d7c --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/bar.ex @@ -0,0 +1 @@ +define_type("BAR", Const, FOO); diff --git a/spec/output/generator_spec_elixir/test.x/base.ex b/spec/output/generator_spec_elixir/test.x/base.ex new file mode 100644 index 000000000..d54324fd3 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/base.ex @@ -0,0 +1,439 @@ +defmodule MyXDR.Int do + @moduledoc """ + Representation of Stellar `Int` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(int :: integer()) :: t() + def new(int), do: %__MODULE__{datum: int} + + @impl true + def encode_xdr(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr(%XDR.Int{datum: int}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: int}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: int}, rest}} -> {:ok, {new(int), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: int}, rest} = XDR.Int.decode_xdr!(bytes) + {new(int), rest} + end +end + +defmodule MyXDR.UInt do + @moduledoc """ + Representation of Stellar `UInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr(%XDR.UInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr!(%XDR.UInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.UInt.decode_xdr(bytes) do + {:ok, {%XDR.UInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.UInt{datum: uint}, rest} = XDR.UInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Float do + @moduledoc """ + Representation of Stellar `Float` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr(%XDR.Float{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Float.decode_xdr(bytes) do + {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.DoubleFloat do + @moduledoc """ + Representation of Stellar `DoubleFloat` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.DoubleFloat.decode_xdr(bytes) do + {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.HyperUInt do + @moduledoc """ + Representation of Stellar `HyperUInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr!(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperUInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperUInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperUInt{datum: uint}, rest} = XDR.HyperUInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Bool do + @moduledoc """ + Representation of Stellar `Bool` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: boolean()} + + defstruct [:value] + + @spec new(value :: boolean()) :: t() + def new(val), do: %__MODULE__{value: val} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr(%XDR.Bool{identifier: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr!(%XDR.Bool{identifier: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Bool.decode_xdr(bytes) do + {:ok, {%XDR.Bool{identifier: val}, rest}} -> {:ok, {new(val), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Bool{identifier: val}, rest} = XDR.Bool.decode_xdr!(bytes) + {new(val), rest} + end +end + +defmodule MyXDR.String do + @moduledoc """ + Representation of Stellar `String` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end +end + +defmodule MyXDR.FixedOpaque do + @moduledoc """ + Representation of Stellar `FixedOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length = 4_294_967_295 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.VariableOpaque do + @moduledoc """ + Representation of Stellar `VariableOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @opaque_spec XDR.VariableOpaque.new(nil) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr!(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.VariableOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.Void do + @moduledoc """ + Representation of Stellar `Void` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: nil} + + defstruct [:value] + + @spec new(value :: nil) :: t() + def new(_val \\ nil), do: %__MODULE__{value: nil} + + @impl true + def encode_xdr(%__MODULE__{}) do + XDR.Void.encode_xdr(%XDR.Void{}) + end + + @impl true + def encode_xdr!(%__MODULE__{}) do + XDR.Void.encode_xdr!(%XDR.Void{}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Void.decode_xdr(bytes) do + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {nil, rest} = XDR.Void.decode_xdr!(bytes) + {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/foo.ex b/spec/output/generator_spec_elixir/test.x/foo.ex new file mode 100644 index 000000000..00ac87789 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/foo.ex @@ -0,0 +1 @@ +define_type("FOO", Const, 1244); diff --git a/spec/output/generator_spec_elixir/test.x/has_stuff.ex b/spec/output/generator_spec_elixir/test.x/has_stuff.ex index 290eab989..54accd685 100644 --- a/spec/output/generator_spec_elixir/test.x/has_stuff.ex +++ b/spec/output/generator_spec_elixir/test.x/has_stuff.ex @@ -23,42 +23,41 @@ defmodule MyXDR.HasStuff do defstruct [:data] @spec new(data :: data()) :: t() - def new( %LotsOfMyStructs{} = data ), do: %__MODULE__{data: data} @impl true - def encode_xdr(%__MODULE__{data: data}) do + def encode_xdr(%__MODULE__{data: data}) do [data: data] |> XDR.Struct.new() |> XDR.Struct.encode_xdr() - end + end @impl true - def encode_xdr!(%__MODULE__{data: data}) do + def encode_xdr!(%__MODULE__{data: data}) do [data: data] |> XDR.Struct.new() |> XDR.Struct.encode_xdr!() - end + end - @impl true - def decode_xdr(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) def decode_xdr(bytes, struct) do case XDR.Struct.decode_xdr(bytes, struct) do - {:ok, {%XDR.Struct{components: [data: data]}, rest}} -> + {:ok, {%XDR.Struct{components: [data: data]}, rest}} -> {:ok, {new(data), rest}} error -> error end - end + end - @impl true - def decode_xdr!(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) def decode_xdr!(bytes, struct) do - {%XDR.Struct{components: [data: data]}, rest} = + {%XDR.Struct{components: [data: data]}, rest} = XDR.Struct.decode_xdr!(bytes, struct) {new(data), rest} end diff --git a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex index 6219a6f33..828d13be8 100644 --- a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex +++ b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex @@ -23,42 +23,41 @@ defmodule MyXDR.LotsOfMyStructs do defstruct [:members] @spec new(members :: members()) :: t() - def new( %MyStructList{} = members ), do: %__MODULE__{members: members} @impl true - def encode_xdr(%__MODULE__{members: members}) do + def encode_xdr(%__MODULE__{members: members}) do [members: members] |> XDR.Struct.new() |> XDR.Struct.encode_xdr() - end + end @impl true - def encode_xdr!(%__MODULE__{members: members}) do + def encode_xdr!(%__MODULE__{members: members}) do [members: members] |> XDR.Struct.new() |> XDR.Struct.encode_xdr!() - end + end - @impl true - def decode_xdr(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) def decode_xdr(bytes, struct) do case XDR.Struct.decode_xdr(bytes, struct) do - {:ok, {%XDR.Struct{components: [members: members]}, rest}} -> + {:ok, {%XDR.Struct{components: [members: members]}, rest}} -> {:ok, {new(members), rest}} error -> error end - end + end - @impl true - def decode_xdr!(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) def decode_xdr!(bytes, struct) do - {%XDR.Struct{components: [members: members]}, rest} = + {%XDR.Struct{components: [members: members]}, rest} = XDR.Struct.decode_xdr!(bytes, struct) {new(members), rest} end diff --git a/spec/output/generator_spec_elixir/test.x/my_struct.ex b/spec/output/generator_spec_elixir/test.x/my_struct.ex index a26652931..975e679fe 100644 --- a/spec/output/generator_spec_elixir/test.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/test.x/my_struct.ex @@ -35,7 +35,6 @@ defmodule MyXDR.MyStruct do defstruct [:field1, :field2, :field3, :field4, :field5, :field6, :field7] @spec new(field1 :: field1(), field2 :: field2(), field3 :: field3(), field4 :: field4(), field5 :: field5(), field6 :: field6(), field7 :: field7()) :: t() - def new( %Uint512{} = field1, %OptHash1{} = field2, @@ -48,35 +47,35 @@ defmodule MyXDR.MyStruct do do: %__MODULE__{field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7} @impl true - def encode_xdr(%__MODULE__{field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7}) do + def encode_xdr(%__MODULE__{field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7}) do [field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7] |> XDR.Struct.new() |> XDR.Struct.encode_xdr() - end + end @impl true - def encode_xdr!(%__MODULE__{field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7}) do + def encode_xdr!(%__MODULE__{field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7}) do [field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7] |> XDR.Struct.new() |> XDR.Struct.encode_xdr!() - end + end - @impl true - def decode_xdr(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) def decode_xdr(bytes, struct) do case XDR.Struct.decode_xdr(bytes, struct) do - {:ok, {%XDR.Struct{components: [field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7]}, rest}} -> + {:ok, {%XDR.Struct{components: [field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7]}, rest}} -> {:ok, {new(field1, field2, field3, field4, field5, field6, field7), rest}} error -> error end - end + end - @impl true - def decode_xdr!(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) def decode_xdr!(bytes, struct) do - {%XDR.Struct{components: [field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7]}, rest} = + {%XDR.Struct{components: [field1: field1, field2: field2, field3: field3, field4: field4, field5: field5, field6: field6, field7: field7]}, rest} = XDR.Struct.decode_xdr!(bytes, struct) {new(field1, field2, field3, field4, field5, field6, field7), rest} end diff --git a/spec/output/generator_spec_elixir/test.x/nested_struct.ex b/spec/output/generator_spec_elixir/test.x/nested_struct.ex index eaea2fe17..4cb32bccc 100644 --- a/spec/output/generator_spec_elixir/test.x/nested_struct.ex +++ b/spec/output/generator_spec_elixir/test.x/nested_struct.ex @@ -23,42 +23,41 @@ defmodule MyXDR.NestedStruct do defstruct [:blah] @spec new(blah :: blah()) :: t() - def new( %Int{} = blah ), do: %__MODULE__{blah: blah} @impl true - def encode_xdr(%__MODULE__{blah: blah}) do + def encode_xdr(%__MODULE__{blah: blah}) do [blah: blah] |> XDR.Struct.new() |> XDR.Struct.encode_xdr() - end + end @impl true - def encode_xdr!(%__MODULE__{blah: blah}) do + def encode_xdr!(%__MODULE__{blah: blah}) do [blah: blah] |> XDR.Struct.new() |> XDR.Struct.encode_xdr!() - end + end - @impl true - def decode_xdr(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) def decode_xdr(bytes, struct) do case XDR.Struct.decode_xdr(bytes, struct) do - {:ok, {%XDR.Struct{components: [blah: blah]}, rest}} -> + {:ok, {%XDR.Struct{components: [blah: blah]}, rest}} -> {:ok, {new(blah), rest}} error -> error end - end + end - @impl true - def decode_xdr!(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) def decode_xdr!(bytes, struct) do - {%XDR.Struct{components: [blah: blah]}, rest} = + {%XDR.Struct{components: [blah: blah]}, rest} = XDR.Struct.decode_xdr!(bytes, struct) {new(blah), rest} end diff --git a/spec/output/generator_spec_elixir/test.x/nester.ex b/spec/output/generator_spec_elixir/test.x/nester.ex index 3b7755dd6..268e81140 100644 --- a/spec/output/generator_spec_elixir/test.x/nester.ex +++ b/spec/output/generator_spec_elixir/test.x/nester.ex @@ -13,59 +13,58 @@ defmodule MyXDR.Nester do alias MyXDR.{NesterNestedEnum, NesterNestedStruct, NesterNestedUnion} @struct_spec XDR.Struct.new( - nestedEnum: NesterNestedEnum, - nestedStruct: NesterNestedStruct, - nestedUnion: NesterNestedUnion + nested_enum: NesterNestedEnum, + nested_struct: NesterNestedStruct, + nested_union: NesterNestedUnion ) - @type nestedEnum :: NesterNestedEnum.t() - @type nestedStruct :: NesterNestedStruct.t() - @type nestedUnion :: NesterNestedUnion.t() + @type nested_enum :: NesterNestedEnum.t() + @type nested_struct :: NesterNestedStruct.t() + @type nested_union :: NesterNestedUnion.t() - @type t :: %__MODULE__{nestedEnum: nestedEnum(), nestedStruct: nestedStruct(), nestedUnion: nestedUnion()} + @type t :: %__MODULE__{nested_enum: nested_enum(), nested_struct: nested_struct(), nested_union: nested_union()} - defstruct [:nestedEnum, :nestedStruct, :nestedUnion] - - @spec new(nestedEnum :: nestedEnum(), nestedStruct :: nestedStruct(), nestedUnion :: nestedUnion()) :: t() + defstruct [:nested_enum, :nested_struct, :nested_union] + @spec new(nested_enum :: nested_enum(), nested_struct :: nested_struct(), nested_union :: nested_union()) :: t() def new( - %NesterNestedEnum{} = nestedEnum, - %NesterNestedStruct{} = nestedStruct, - %NesterNestedUnion{} = nestedUnion + %NesterNestedEnum{} = nested_enum, + %NesterNestedStruct{} = nested_struct, + %NesterNestedUnion{} = nested_union ), - do: %__MODULE__{nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion} + do: %__MODULE__{nested_enum: nested_enum, nested_struct: nested_struct, nested_union: nested_union} @impl true - def encode_xdr(%__MODULE__{nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion}) do - [nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion] + def encode_xdr(%__MODULE__{nested_enum: nested_enum, nested_struct: nested_struct, nested_union: nested_union}) do + [nested_enum: nested_enum, nested_struct: nested_struct, nested_union: nested_union] |> XDR.Struct.new() |> XDR.Struct.encode_xdr() - end + end @impl true - def encode_xdr!(%__MODULE__{nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion}) do - [nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion] + def encode_xdr!(%__MODULE__{nested_enum: nested_enum, nested_struct: nested_struct, nested_union: nested_union}) do + [nested_enum: nested_enum, nested_struct: nested_struct, nested_union: nested_union] |> XDR.Struct.new() |> XDR.Struct.encode_xdr!() - end + end - @impl true - def decode_xdr(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr(bytes, struct \\ @struct_spec) def decode_xdr(bytes, struct) do case XDR.Struct.decode_xdr(bytes, struct) do - {:ok, {%XDR.Struct{components: [nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion]}, rest}} -> - {:ok, {new(nestedEnum, nestedStruct, nestedUnion), rest}} + {:ok, {%XDR.Struct{components: [nested_enum: nested_enum, nested_struct: nested_struct, nested_union: nested_union]}, rest}} -> + {:ok, {new(nested_enum, nested_struct, nested_union), rest}} error -> error end - end + end - @impl true - def decode_xdr!(bytes, struct \\ @struct_spec) + @impl true + def decode_xdr!(bytes, struct \\ @struct_spec) def decode_xdr!(bytes, struct) do - {%XDR.Struct{components: [nestedEnum: nestedEnum, nestedStruct: nestedStruct, nestedUnion: nestedUnion]}, rest} = + {%XDR.Struct{components: [nested_enum: nested_enum, nested_struct: nested_struct, nested_union: nested_union]}, rest} = XDR.Struct.decode_xdr!(bytes, struct) - {new(nestedEnum, nestedStruct, nestedUnion), rest} + {new(nested_enum, nested_struct, nested_union), rest} end end diff --git a/spec/output/generator_spec_elixir/union.x/base.ex b/spec/output/generator_spec_elixir/union.x/base.ex new file mode 100644 index 000000000..d54324fd3 --- /dev/null +++ b/spec/output/generator_spec_elixir/union.x/base.ex @@ -0,0 +1,439 @@ +defmodule MyXDR.Int do + @moduledoc """ + Representation of Stellar `Int` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: integer()} + + defstruct [:datum] + + @spec new(int :: integer()) :: t() + def new(int), do: %__MODULE__{datum: int} + + @impl true + def encode_xdr(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr(%XDR.Int{datum: int}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: int}) do + XDR.Int.encode_xdr!(%XDR.Int{datum: int}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Int.decode_xdr(bytes) do + {:ok, {%XDR.Int{datum: int}, rest}} -> {:ok, {new(int), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Int{datum: int}, rest} = XDR.Int.decode_xdr!(bytes) + {new(int), rest} + end +end + +defmodule MyXDR.UInt do + @moduledoc """ + Representation of Stellar `UInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr(%XDR.UInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.UInt.encode_xdr!(%XDR.UInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.UInt.decode_xdr(bytes) do + {:ok, {%XDR.UInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.UInt{datum: uint}, rest} = XDR.UInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Float do + @moduledoc """ + Representation of Stellar `Float` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr(%XDR.Float{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Float.decode_xdr(bytes) do + {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.DoubleFloat do + @moduledoc """ + Representation of Stellar `DoubleFloat` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: float()} + + defstruct [:datum] + + @spec new(float :: float()) :: t() + def new(float), do: %__MODULE__{datum: float} + + @impl true + def encode_xdr(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.DoubleFloat.decode_xdr(bytes) do + {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {new(float), rest} + end +end + +defmodule MyXDR.HyperUInt do + @moduledoc """ + Representation of Stellar `HyperUInt` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{datum: non_neg_integer()} + + defstruct [:datum] + + @spec new(uint :: non_neg_integer()) :: t() + def new(uint), do: %__MODULE__{datum: uint} + + @impl true + def encode_xdr(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def encode_xdr!(%__MODULE__{datum: uint}) do + XDR.HyperUInt.encode_xdr!(%XDR.HyperUInt{datum: uint}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.HyperUInt.decode_xdr(bytes) do + {:ok, {%XDR.HyperUInt{datum: uint}, rest}} -> {:ok, {new(uint), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.HyperUInt{datum: uint}, rest} = XDR.HyperUInt.decode_xdr!(bytes) + {new(uint), rest} + end +end + +defmodule MyXDR.Bool do + @moduledoc """ + Representation of Stellar `Bool` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: boolean()} + + defstruct [:value] + + @spec new(value :: boolean()) :: t() + def new(val), do: %__MODULE__{value: val} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr(%XDR.Bool{identifier: value}) + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + XDR.Bool.encode_xdr!(%XDR.Bool{identifier: value}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Bool.decode_xdr(bytes) do + {:ok, {%XDR.Bool{identifier: val}, rest}} -> {:ok, {new(val), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Bool{identifier: val}, rest} = XDR.Bool.decode_xdr!(bytes) + {new(val), rest} + end +end + +defmodule MyXDR.String do + @moduledoc """ + Representation of Stellar `String` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end +end + +defmodule MyXDR.FixedOpaque do + @moduledoc """ + Representation of Stellar `FixedOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length = 4_294_967_295 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.VariableOpaque do + @moduledoc """ + Representation of Stellar `VariableOpaque` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @opaque_spec XDR.VariableOpaque.new(nil) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr!(%XDR.VariableOpaque{opaque: opaque}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.VariableOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes, spec) + {new(opaque), rest} + end +end + +defmodule MyXDR.Void do + @moduledoc """ + Representation of Stellar `Void` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: nil} + + defstruct [:value] + + @spec new(value :: nil) :: t() + def new(_val \\ nil), do: %__MODULE__{value: nil} + + @impl true + def encode_xdr(%__MODULE__{}) do + XDR.Void.encode_xdr(%XDR.Void{}) + end + + @impl true + def encode_xdr!(%__MODULE__{}) do + XDR.Void.encode_xdr!(%XDR.Void{}) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Void.decode_xdr(bytes) do + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {nil, rest} = XDR.Void.decode_xdr!(bytes) + {new(), rest} + end +end From 308d080a4f06538c4366c5e8902db8e157d47f60 Mon Sep 17 00:00:00 2001 From: Elisabet Salazar <40662951+elisa6@users.noreply.github.com> Date: Thu, 4 May 2023 16:58:13 -0500 Subject: [PATCH 06/13] Add a function to generate a typedef part 2 (#7) * Generate typedef types part 2 * Add Optional function * Remove unnecessary file * Generate simple typedef * Remove unnecessary function --------- Co-authored-by: jenietoc --- lib/xdrgen/generators/elixir.rb | 705 ++++++++++++++---- .../block_comments.x/MyXDR_generated.ex | 19 - .../const.x/MyXDR_generated.ex | 31 - .../const.x/test_array.ex | 59 ++ .../const.x/test_array2.ex | 59 ++ .../const.x/testarray.ex | 47 -- .../const.x/testarray2.ex | 47 -- .../enum.x/MyXDR_generated.ex | 60 -- .../nesting.x/MyXDR_generated.ex | 68 -- .../nesting.x/{one.ex => my_union_one.ex} | 8 +- .../nesting.x/{two.ex => my_union_two.ex} | 9 +- .../optional.x/MyXDR_generated.ex | 28 - .../generator_spec_elixir/optional.x/arr.ex | 44 +- .../optional.x/has_options.ex | 5 +- .../optional.x/optional_arr.ex | 59 ++ .../optional.x/optional_int.ex | 59 ++ .../struct.x/MyXDR_generated.ex | 30 - .../struct.x/my_struct.ex | 14 +- .../struct.x/opaque10.ex | 51 ++ .../struct.x/string100.ex | 53 ++ .../test.x/MyXDR_generated.ex | 234 ------ .../generator_spec_elixir/test.x/has_stuff.ex | 4 +- .../generator_spec_elixir/test.x/hash.ex | 40 + .../generator_spec_elixir/test.x/hashes1.ex | 46 ++ .../generator_spec_elixir/test.x/hashes2.ex | 46 ++ .../generator_spec_elixir/test.x/hashes3.ex | 46 ++ .../test.x/lots_of_my_structs.ex | 4 +- .../generator_spec_elixir/test.x/my_struct.ex | 10 +- .../generator_spec_elixir/test.x/nester.ex | 6 +- .../{nested_enum.ex => nester_nested_enum.ex} | 4 +- ...sted_struct.ex => nester_nested_struct.ex} | 8 +- ...nested_union.ex => nester_nested_union.ex} | 4 +- .../generator_spec_elixir/test.x/opaque32.ex | 51 ++ .../generator_spec_elixir/test.x/opaque64.ex | 51 ++ .../generator_spec_elixir/test.x/opt_hash1.ex | 59 ++ .../generator_spec_elixir/test.x/opt_hash2.ex | 59 ++ .../generator_spec_elixir/test.x/opthash1.ex | 13 - .../generator_spec_elixir/test.x/opthash2.ex | 13 - .../generator_spec_elixir/test.x/str.ex | 40 + .../generator_spec_elixir/test.x/str2.ex | 38 + .../generator_spec_elixir/test.x/uint512.ex | 40 + .../generator_spec_elixir/test.x/uint513.ex | 40 + .../generator_spec_elixir/test.x/uint514.ex | 40 + .../test.x/variable_opaque64.ex | 51 ++ .../union.x/MyXDR_generated.ex | 69 -- .../union.x/int_union2.ex | 49 ++ .../union.x/intunion2.ex | 13 - 47 files changed, 1690 insertions(+), 843 deletions(-) delete mode 100644 spec/output/generator_spec_elixir/block_comments.x/MyXDR_generated.ex delete mode 100644 spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex create mode 100644 spec/output/generator_spec_elixir/const.x/test_array.ex create mode 100644 spec/output/generator_spec_elixir/const.x/test_array2.ex delete mode 100644 spec/output/generator_spec_elixir/const.x/testarray.ex delete mode 100644 spec/output/generator_spec_elixir/const.x/testarray2.ex delete mode 100644 spec/output/generator_spec_elixir/enum.x/MyXDR_generated.ex delete mode 100644 spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex rename spec/output/generator_spec_elixir/nesting.x/{one.ex => my_union_one.ex} (92%) rename spec/output/generator_spec_elixir/nesting.x/{two.ex => my_union_two.ex} (92%) delete mode 100644 spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex create mode 100644 spec/output/generator_spec_elixir/optional.x/optional_arr.ex create mode 100644 spec/output/generator_spec_elixir/optional.x/optional_int.ex delete mode 100644 spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex create mode 100644 spec/output/generator_spec_elixir/struct.x/opaque10.ex create mode 100644 spec/output/generator_spec_elixir/struct.x/string100.ex delete mode 100644 spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex rename spec/output/generator_spec_elixir/test.x/{nested_enum.ex => nester_nested_enum.ex} (93%) rename spec/output/generator_spec_elixir/test.x/{nested_struct.ex => nester_nested_struct.ex} (91%) rename spec/output/generator_spec_elixir/test.x/{nested_union.ex => nester_nested_union.ex} (94%) create mode 100644 spec/output/generator_spec_elixir/test.x/opaque32.ex create mode 100644 spec/output/generator_spec_elixir/test.x/opaque64.ex create mode 100644 spec/output/generator_spec_elixir/test.x/opt_hash1.ex create mode 100644 spec/output/generator_spec_elixir/test.x/opt_hash2.ex delete mode 100644 spec/output/generator_spec_elixir/test.x/opthash1.ex delete mode 100644 spec/output/generator_spec_elixir/test.x/opthash2.ex create mode 100644 spec/output/generator_spec_elixir/test.x/variable_opaque64.ex delete mode 100644 spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex create mode 100644 spec/output/generator_spec_elixir/union.x/int_union2.ex delete mode 100644 spec/output/generator_spec_elixir/union.x/intunion2.ex diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index 6f9b5009e..cd1ee97da 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -30,7 +30,7 @@ def render_definition(defn) when AST::Definitions::Union ; render_union defn when AST::Definitions::Typedef ; - render_typedef defn + render_typedef(defn, false) when AST::Definitions::Const ; render_const defn end @@ -77,16 +77,8 @@ def render_define_block(out, module_name) out.break end - def render_typedef(typedef) - file_name = "#{typedef.name.downcase}.ex" - out = @output.open(file_name) - - render_define_block(out, typedef.name.downcase) do - out.indent do - build_typedef(out, typedef) - end - end - out.close + def render_typedef(typedef, is_struct) + build_typedef(typedef, is_struct) end def render_const(const) @@ -96,18 +88,43 @@ def render_const(const) out.puts "define_type(\"#{const_name const}\", Const, #{const.value});" end + def render_other_type(type) + begin + number = type_reference(type, type.name.camelize).scan(/\d+/).first + unless number.nil? + render_typedef(type, true) + else + if type.declaration.type.sub_type == :optional + variable = type.declaration.type + base_type = type_string(variable) + name = type_reference(type, type.name.camelize) + build_optional_typedef(type, base_type.downcase, name) + end + end + rescue => exception + end + end + def render_struct(struct) - file_name = "#{struct.name.underscore.downcase}.ex" + struct_name = name struct + file_name = "#{struct_name.underscore}.ex" out = @output.open(file_name) - render_define_block(out, struct.name) do + render_define_block(out, struct_name) do out.indent do - alias_namespace = "alias #{@namespace}.{" + out.puts "alias #{@namespace}.{\n" + out.indent do + alias_list = "" struct.members.each_with_index do |m, i| - alias_namespace += "#{type_reference m, m.name.camelize}#{comma_and_space_unless_last(i, struct.members)}" + name = type_reference m, m.name.camelize + unless alias_list.include?(name) + alias_list += "#{name}#{comma_unless_last(i, struct.members)}\n" + render_other_type(m) + end end - alias_namespace += "} \n\n" - out.puts alias_namespace + out.puts alias_list + end + out.puts "} \n\n" out.puts "@struct_spec XDR.Struct.new(" out.indent do @@ -250,10 +267,11 @@ def render_struct(struct) end def render_enum(enum) - file_name = "#{enum.name.underscore.downcase}.ex" + enum_name = name enum + file_name = "#{enum_name.underscore}.ex" out = @output.open(file_name) - render_define_block(out, enum.name) do + render_define_block(out, enum_name) do out.indent do out.puts "@declarations [\n" out.indent do @@ -318,18 +336,20 @@ def render_enum(enum) end def render_union(union) - file_name = "#{union.name.underscore.downcase}.ex" - out = @output.open(file_name) + union_name = name union union_name_camelize = union.name.camelize union_discriminant = union.discriminant - render_define_block(out, union.name) do + file_name = "#{union_name.underscore}.ex" + out = @output.open(file_name) + + render_define_block(out, union_name) do out.indent do out.puts "alias #{@namespace}.{\n" out.indent do out.puts "#{type_reference union_discriminant, union_name_camelize}," union.arms.each_with_index do |arm, i| - arm_name = arm.void? ? "Void" : "#{type_reference arm.declaration, arm.name.camelize}" + arm_name = arm.void? ? "Void" : "#{type_reference arm, arm.name.camelize}" out.puts "#{arm_name}#{comma_unless_last(i, union.arms)}" end end @@ -338,7 +358,7 @@ def render_union(union) out.puts "@arms [" out.indent do union.normal_arms.each_with_index do |arm, i| - arm_name = arm.void? ? "Void" : "#{type_reference arm.declaration, arm.name.camelize}" + arm_name = arm.void? ? "Void" : "#{type_reference arm, arm.name.camelize}" arm.cases.each do |acase| switch = if acase.value.is_a?(AST::Identifier) @@ -352,7 +372,7 @@ def render_union(union) end if union.default_arm.present? - out.puts "default: #{type_reference union.default_arm.declaration, union.default_arm.name.camelize}" + out.puts "default: #{type_reference union.default_arm, union.default_arm.name.camelize}" end end out.puts "]\n\n" @@ -360,7 +380,7 @@ def render_union(union) out.puts "@type value ::" out.indent(4) do union.arms.each_with_index do |arm, i| - arm_name = arm.void? ? "Void" : "#{type_reference arm.declaration, arm.name.camelize}" + arm_name = arm.void? ? "Void" : "#{type_reference arm, arm.name.camelize}" if i == 0 out.puts "#{arm_name}.t()" else @@ -446,19 +466,6 @@ def render_base_classes out.close end - def name(named) - return nil unless named.respond_to?(:name) - - parent = name named.parent_defn if named.is_a?(AST::Concerns::NestedDefinition) - - # NOTE: classify will strip plurality, so we restore it if necessary - plural = named.name.underscore.downcase.pluralize == named.name.underscore.downcase - base = named.name.underscore.classify - result = plural ? base.pluralize : base - - "#{parent}#{result}" - end - def const_name(named) named.name.underscore.upcase end @@ -502,6 +509,12 @@ def comma_and_space_unless_last(index, collection) def type_string(type) case type + when AST::Typespecs::Simple + "#{name type}" + when AST::Definitions::Base + "#{name type}" + when AST::Concerns::NestedDefinition + "#{name type}" when AST::Typespecs::Bool "Bool" when AST::Typespecs::Double @@ -514,7 +527,7 @@ def type_string(type) "Int" when AST::Typespecs::Opaque if type.fixed? - "FixedOpaque#{type.size}" + "Opaque#{type.size}" else type.size ? "VariableOpaque#{type.size}" : "VariableOpaque" end @@ -526,139 +539,565 @@ def type_string(type) "HyperUInt" when AST::Typespecs::UnsignedInt "UInt" - when AST::Typespecs::Simple - "#{name type}" - when AST::Definitions::Base - "#{name type}" - when AST::Concerns::NestedDefinition - "#{name type}" else raise "Unknown reference type: #{type.class.name}, #{type.class.ancestors}" end end - def build_number_typedef(out, number_type, type, attribute) - out.puts "@type t :: %__MODULE__{#{attribute}: #{number_type}()}\n\n" + def build_simple_typedef(typedef, type, module_name, is_struct) + unless is_struct + attribute = module_name.underscore.downcase + file_name = "#{attribute}.ex" + out = @output.open(file_name) - out.puts "defstruct [:#{attribute}]\n\n" + render_define_block(out, module_name) do + out.indent do + out.puts "alias #{@namespace}.#{type}\n\n" - out.puts "@spec new(value :: #{number_type}()) :: t()\n" - out.puts "def new(value), do: %__MODULE__{#{attribute}: value}\n\n" + out.puts "@type t :: %__MODULE__{#{attribute}: #{type}.t()}\n\n" - out.puts "@impl true" - out.puts "def encode_xdr(%__MODULE__{#{attribute}: value}) do\n" - out.indent do - out.puts "XDR.#{type}.encode_xdr(%XDR.#{type}{datum: value})\n" - end - out.puts "end\n\n" + out.puts "defstruct [:#{attribute}]\n\n" - out.puts "@impl true" - out.puts "def encode_xdr!(%__MODULE__{#{attribute}: value}) do\n" - out.indent do - out.puts "XDR.#{type}.encode_xdr!(%XDR.#{type}{datum: value})\n" + out.puts "@spec new(#{attribute} :: #{type}.t()) :: t()\n" + out.puts "def new(%#{type}{} = #{attribute}), do: %__MODULE__{#{attribute}: #{attribute}}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{#{attribute}: #{attribute}}) do\n" + out.indent do + out.puts "#{type}.encode_xdr(#{attribute})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{#{attribute}: #{attribute}}) do\n" + out.indent do + out.puts "#{type}.encode_xdr!(#{attribute})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr(bytes, _term) do\n" + out.indent do + out.puts "case #{type}.decode_xdr(bytes) do\n" + out.indent do + out.puts "{:ok, {%#{type}{} = #{attribute}, rest}} -> {:ok, {new(#{attribute}), rest}}\n" + out.puts "error -> error\n" + end + out.puts "end\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr!(bytes, _term) do\n" + out.indent do + out.puts "{%#{type}{} = #{attribute}, rest} = #{type}.decode_xdr!(bytes)\n" + out.puts "{new(#{attribute}), rest}\n" + end + out.puts "end\n" + end + end + out.close end - out.puts "end\n\n" + end - out.puts "@impl true" - out.puts "def decode_xdr(bytes, term \\\\ nil)\n\n" + def build_number_typedef(typedef, number_type, type, attribute) + file_name = "#{typedef.name.underscore.downcase}.ex" + out = @output.open(file_name) - out.puts "def decode_xdr(bytes, _term) do\n" - out.indent do - out.puts "case XDR.#{type}.decode_xdr(bytes) do\n" + render_define_block(out, typedef.name) do out.indent do - out.puts "{:ok, {%XDR.#{type}{datum: value}, rest}} -> {:ok, {new(value), rest}}\n" - out.puts "error -> error\n" + out.puts "@type t :: %__MODULE__{#{attribute}: #{number_type}()}\n\n" + + out.puts "defstruct [:#{attribute}]\n\n" + + out.puts "@spec new(value :: #{number_type}()) :: t()\n" + out.puts "def new(value), do: %__MODULE__{#{attribute}: value}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{#{attribute}: value}) do\n" + out.indent do + out.puts "XDR.#{type}.encode_xdr(%XDR.#{type}{datum: value})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{#{attribute}: value}) do\n" + out.indent do + out.puts "XDR.#{type}.encode_xdr!(%XDR.#{type}{datum: value})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr(bytes, _term) do\n" + out.indent do + out.puts "case XDR.#{type}.decode_xdr(bytes) do\n" + out.indent do + out.puts "{:ok, {%XDR.#{type}{datum: value}, rest}} -> {:ok, {new(value), rest}}\n" + out.puts "error -> error\n" + end + out.puts "end\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr!(bytes, _term) do\n" + out.indent do + out.puts "{%XDR.#{type}{datum: value}, rest} = XDR.#{type}.decode_xdr!(bytes)\n" + out.puts "{new(value), rest}\n" + end + out.puts "end\n" end - out.puts "end\n" end - out.puts "end\n\n" + out.close + end - out.puts "@impl true" - out.puts "def decode_xdr!(bytes, term \\\\ nil)\n\n" + def build_bool_typedef(typedef, number_type, type, attribute) + file_name = "#{typedef.name.downcase.underscore}.ex" + out = @output.open(file_name) - out.puts "def decode_xdr!(bytes, _term) do\n" - out.indent do - out.puts "{%XDR.#{type}{datum: value}, rest} = XDR.#{type}.decode_xdr!(bytes)\n" - out.puts "{new(value), rest}\n" + render_define_block(out, typedef.name.downcase) do + out.indent do + out.puts "@type t :: %__MODULE__{#{attribute}: #{number_type}()}\n\n" + + out.puts "defstruct [:#{attribute}]\n\n" + + out.puts "@spec new(value :: #{number_type}()) :: t()\n" + out.puts "def new(value), do: %__MODULE__{#{attribute}: value}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{#{attribute}: value}) do\n" + out.indent do + out.puts "XDR.#{type}.encode_xdr(%XDR.#{type}{identifier: value})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{#{attribute}: value}) do\n" + out.indent do + out.puts "XDR.#{type}.encode_xdr!(%XDR.#{type}{identifier: value})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr(bytes, _term) do\n" + out.indent do + out.puts "case XDR.#{type}.decode_xdr(bytes) do\n" + out.indent do + out.puts "{:ok, {%XDR.#{type}{identifier: value}, rest}} -> {:ok, {new(value), rest}}\n" + out.puts "error -> error\n" + end + out.puts "end\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr!(bytes, _term) do\n" + out.indent do + out.puts "{%XDR.#{type}{identifier: value}, rest} = XDR.#{type}.decode_xdr!(bytes)\n" + out.puts "{new(value), rest}\n" + end + out.puts "end\n" + end end - out.puts "end\n" + out.close end - def build_bool_typedef(out, number_type, type, attribute) - out.puts "@type t :: %__MODULE__{#{attribute}: #{number_type}()}\n\n" + def build_string_typedef(typedef, is_struct) + name = is_struct ? type_string(typedef.declaration.type) : typedef.name - out.puts "defstruct [:#{attribute}]\n\n" + file_name = "#{name.downcase.underscore}.ex" + out = @output.open(file_name) - out.puts "@spec new(value :: #{number_type}()) :: t()\n" - out.puts "def new(value), do: %__MODULE__{#{attribute}: value}\n\n" + render_define_block(out, name.downcase) do + out.indent do + out.puts "@type t :: %__MODULE__{value: String.t()}\n\n" - out.puts "@impl true" - out.puts "def encode_xdr(%__MODULE__{#{attribute}: value}) do\n" - out.indent do - out.puts "XDR.#{type}.encode_xdr(%XDR.#{type}{identifier: value})\n" - end - out.puts "end\n\n" + out.puts "defstruct [:value]\n\n" - out.puts "@impl true" - out.puts "def encode_xdr!(%__MODULE__{#{attribute}: value}) do\n" - out.indent do - out.puts "XDR.#{type}.encode_xdr!(%XDR.#{type}{identifier: value})\n" + unless typedef.declaration.type.size.nil? + out.puts "@max_lenght #{typedef.declaration.type.size}\n\n" + end + + out.puts "@spec new(value :: String.t()) :: t()\n" + out.puts "def new(value), do: %__MODULE__{value: value}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{value: value}) do\n" + out.indent do + out.puts "value\n" + unless typedef.declaration.type.size.nil? + out.puts "|> XDR.String.new(@max_length)\n" + else + out.puts "|> XDR.String.new()\n" + end + out.puts "|> XDR.String.encode_xdr()" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{value: value}) do\n" + out.indent do + out.puts "value\n" + unless typedef.declaration.type.size.nil? + out.puts "|> XDR.String.new(@max_length)\n" + else + out.puts "|> XDR.String.new()\n" + end + out.puts "|> XDR.String.encode_xdr!()" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr(bytes, _term) do\n" + out.indent do + out.puts "case XDR.String.decode_xdr(bytes) do\n" + out.indent do + out.puts "{:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}}\n" + out.puts "error -> error\n" + end + out.puts "end\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, term \\\\ nil)\n\n" + + out.puts "def decode_xdr!(bytes, _term) do\n" + out.indent do + out.puts "{%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes)\n" + out.puts "{new(value), rest}\n" + end + out.puts "end\n" + end end - out.puts "end\n\n" + out.close + end - out.puts "@impl true" - out.puts "def decode_xdr(bytes, term \\\\ nil)\n\n" + def build_optional_typedef(typedef, attribute, name) + file_name = "#{name.underscore.downcase}.ex" + out = @output.open(file_name) - out.puts "def decode_xdr(bytes, _term) do\n" - out.indent do - out.puts "case XDR.#{type}.decode_xdr(bytes) do\n" + render_define_block(out, "#{name}") do out.indent do - out.puts "{:ok, {%XDR.#{type}{identifier: value}, rest}} -> {:ok, {new(value), rest}}\n" - out.puts "error -> error\n" + out.puts "alias #{@namespace}.#{attribute.capitalize}\n\n" + + out.puts "@optional_spec XDR.Optional.new(#{attribute.capitalize})\n\n" + + out.puts "@type #{attribute} :: #{attribute.capitalize}.t() | nil\n\n" + + out.puts "@type t :: %__MODULE__{#{attribute}: #{attribute}()}\n\n" + + out.puts "defstruct [:#{attribute}]\n\n" + + + out.puts "@spec new(#{attribute} :: #{attribute}()) :: t()\n" + out.puts "def new(#{attribute} \\\\ nil), do: %__MODULE__{#{attribute}: #{attribute}}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{#{attribute}: #{attribute}}) do\n" + out.indent do + out.puts "#{attribute}" + out.puts "|> XDR.Optional.new()" + out.puts "|> XDR.Optional.encode_xdr()" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{#{attribute}: #{attribute}}) do\n" + out.indent do + out.puts "#{attribute}" + out.puts "|> XDR.Optional.new()" + out.puts "|> XDR.Optional.encode_xdr!()" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, optional_spec \\\\ @optional_spec)\n\n" + + out.puts "def decode_xdr(bytes, optional_spec) do\n" + out.indent do + out.puts "case XDR.Optional.decode_xdr(bytes, optional_spec) do\n" + out.indent do + out.puts "{:ok, {%XDR.Optional{type: #{attribute}}, rest}} -> {:ok, {new(#{attribute}), rest}}\n" + out.puts "{:ok, {nil, rest}} -> {:ok, {new(), rest}}" + out.puts "error -> error\n" + end + out.puts "end\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, optional_spec \\\\ @optional_spec)\n\n" + + out.puts "def decode_xdr!(bytes, optional_spec) do\n" + out.indent do + out.puts "{%XDR.Optional{identifier: #{attribute}}, rest} = XDR.Optional.decode_xdr!(bytes)\n" + out.puts "{new(#{attribute}), rest}\n" + out.puts "{nil, rest} -> {new(), rest}" + end + out.puts "end\n" end - out.puts "end\n" end - out.puts "end\n\n" + out.close + end - out.puts "@impl true" - out.puts "def decode_xdr!(bytes, term \\\\ nil)\n\n" + def build_opaque_typedef(typedef, type, xdr_module, size = nil, is_struct) + name = "#{type}#{size}" - out.puts "def decode_xdr!(bytes, _term) do\n" - out.indent do - out.puts "{%XDR.#{type}{identifier: value}, rest} = XDR.#{type}.decode_xdr!(bytes)\n" - out.puts "{new(value), rest}\n" + unless size.nil? + file_name = "#{type.underscore.downcase}#{size}.ex" + out = @output.open(file_name) + + render_define_block(out, name) do + out.indent do + out.puts "@type t :: %__MODULE__{opaque: binary()}\n\n" + + out.puts "defstruct [:opaque]\n\n" + + out.puts "@#{type.downcase == "opaque" ? "length" : "max_size"} #{size}\n\n" + + out.puts "@opaque_spec XDR.#{xdr_module}.new(nil, @#{type.downcase == "opaque" ? "length" : "max_size"})\n\n" + + out.puts "@spec new(opaque :: binary()) :: t()\n" + out.puts "def new(opaque), do: %__MODULE__{opaque: opaque}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{opaque: opaque}) do\n" + out.indent do + out.puts "XDR.#{xdr_module}.encode_xdr(%XDR.#{xdr_module}{opaque: opaque, #{type.downcase == "opaque" ? "length: @length" : "max_size: @max_size"}})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{opaque: opaque}) do\n" + out.indent do + out.puts "XDR.#{xdr_module}.encode_xdr!(%XDR.#{xdr_module}{opaque: opaque, #{type.downcase == "opaque" ? "length: @length" : "max_size: @max_size"}})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, spec \\\\ @opaque_spec)\n\n" + + out.puts "def decode_xdr(bytes, spec) do\n" + out.indent do + out.puts "case XDR.#{xdr_module}.decode_xdr(bytes, spec) do\n" + out.indent do + out.puts "{:ok, {%XDR.#{xdr_module}{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}}\n" + out.puts "error -> error\n" + end + out.puts "end\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, spec \\\\ @opaque_spec)\n\n" + + out.puts "def decode_xdr!(bytes, spec) do\n" + out.indent do + out.puts "{%XDR.#{xdr_module}{opaque: opaque}, rest} = XDR.#{xdr_module}.decode_xdr!(bytes)\n" + out.puts "{new(opaque), rest}\n" + end + out.puts "end\n" + end + end + out.close end - out.puts "end\n" + + unless is_struct + file_name_main = "#{typedef.name.downcase.underscore}.ex" + out_main = @output.open(file_name_main) + render_define_block(out_main, typedef.name.downcase) do + out_main.indent do + out_main.puts "alias #{@namespace}.#{type}#{size}\n\n" + + out_main.puts "@type t :: %__MODULE__{value: binary()}\n\n" + + out_main.puts "defstruct [:value]\n\n" + + out_main.puts "@spec new(value :: binary()) :: t()\n" + out_main.puts "def new(value), do: %__MODULE__{value: value}\n\n" + + out_main.puts "@impl true" + out_main.puts "def encode_xdr(%__MODULE__{value: value}) do\n" + out_main.indent do + out_main.puts "value\n" + out_main.puts "|> #{type}#{size}.new()\n" + out_main.puts "|> #{type}#{size}.encode_xdr()\n" + end + out_main.puts "end\n\n" + + out_main.puts "@impl true" + out_main.puts "def encode_xdr!(%__MODULE__{opaque: opaque}) do\n" + out_main.indent do + out_main.puts "value\n" + out_main.puts "|> #{type}#{size}.new()\n" + out_main.puts "|> #{type}#{size}.encode_xdr()\n" + end + out_main.puts "end\n\n" + + out_main.puts "@impl true" + out_main.puts "def decode_xdr(bytes, term \\\\ nil)\n\n" + + out_main.puts "def decode_xdr(bytes, _term) do\n" + out_main.indent do + out_main.puts "case XDR.#{type}#{size}.decode_xdr(bytes, term) do\n" + out_main.indent do + out_main.puts "{:ok, {%XDR.#{type}#{size}{opaque: value}, rest}} -> {:ok, {new(value), rest}}\n" + out_main.puts "error -> error\n" + end + out_main.puts "end\n" + end + out_main.puts "end\n\n" + + out_main.puts "@impl true" + out_main.puts "def decode_xdr!(bytes, term \\\\ nil)\n\n" + + out_main.puts "def decode_xdr!(bytes, _term) do\n" + out_main.indent do + out_main.puts "{%XDR.#{type}#{size}{opaque: value}, rest} = XDR.#{type}#{size}.decode_xdr!(bytes)\n" + out_main.puts "{new(value), rest}\n" + end + out_main.puts "end\n" + end + end + out_main.close + end + end + + def build_list_typedef(typedef, base_type, size, list_type) + file_name = "#{typedef.name.underscore.downcase}.ex" + out = @output.open(file_name) + + render_define_block(out, typedef.name) do + out.indent do + out.puts "alias #{@namespace}.#{base_type}\n\n" + + out.puts "@#{list_type.downcase == "fixedarray" ? "length" : "max_length"} #{size.nil? ? "4_294_967_295" : size}\n\n" + + out.puts "@array_type #{base_type}\n\n" + + out.puts "@array_spec %{type: @array_type, #{list_type.downcase == "fixedarray" ? "length: @length" : "max_length: @max_length"}}\n\n" + + out.puts "@type t :: %__MODULE__{items: list(#{base_type}.t())}\n\n" + + out.puts "defstruct [:items]\n\n" + + out.puts "@spec new(items :: list(#{base_type}.t())) :: t()\n" + out.puts "def new(items), do: %__MODULE__{items: items}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{items: items}) do\n" + out.indent do + out.puts "items\n" + out.puts "|> XDR.#{list_type}.new(@array_type, @#{list_type.downcase == "fixedarray" ? "length" : "max_length"})\n" + out.puts "|> XDR.#{list_type}.encode_xdr()\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{items: items}) do\n" + out.indent do + out.puts "items\n" + out.puts "|> XDR.#{list_type}.new(@array_type, @#{list_type.downcase == "fixedarray" ? "length" : "max_length"})\n" + out.puts "|> XDR.#{list_type}.encode_xdr!()\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, spec \\\\ @array_spec)\n\n" + + out.puts "def decode_xdr(bytes, spec) do\n" + out.indent do + out.puts "case XDR.#{list_type}.decode_xdr(bytes, spec) do\n" + out.indent do + out.puts "{:ok, {items, rest}} -> {:ok, {new(items), rest}}\n" + out.puts "error -> error\n" + end + out.puts "end\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, spec \\\\ @array_spec)\n\n" + + out.puts "def decode_xdr!(bytes, spec) do\n" + out.indent do + out.puts "{items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec)\n" + out.puts "{new(items), rest}\n" + end + out.puts "end\n" + end + end + out.close end - def build_typedef(out, typedef) + def build_typedef(typedef, is_struct) type = typedef.declaration.type base_type = type_string(type) + name = typedef.name - case type - when AST::Typespecs::Bool - build_bool_typedef(out, "boolean", "Bool", "bool") - "Bool" - when AST::Typespecs::Double - build_number_typedef(out, "float_number", "DoubleFloat", "float") - "DoubleFloat" - when AST::Typespecs::Float - build_number_typedef(out, "float_number", "Float", "float") - "Float" - when AST::Typespecs::Hyper - build_number_typedef(out, "integer", "HyperInt", "datum") - "HyperInt" - when AST::Typespecs::Int - build_number_typedef(out, "integer", "Int", "datum") - "Int" - when AST::Typespecs::UnsignedHyper - build_number_typedef(out, "non_neg_integer", "HyperUInt", "datum") - "HyperUInt" - when AST::Typespecs::UnsignedInt - build_number_typedef(out, "non_neg_integer", "UInt", "datum") - "UInt" + case type.sub_type + when :optional + build_optional_typedef(typedef, base_type.downcase, name) + when :array + is_named, size = type.array_size + size = is_named ? "\"#{size}\"" : size + build_list_typedef(typedef, base_type, size, "FixedArray") + when :var_array + is_named, size = type.array_size + size = is_named ? "\"#{size}\"" : (size || MAX_INT) + build_list_typedef(typedef, base_type, size, "VariableArray") + else + case type + when AST::Typespecs::Bool + build_bool_typedef(typedef, "boolean", "Bool", "bool") + when AST::Typespecs::Double + build_number_typedef(typedef, "float_number", "DoubleFloat", "float") + when AST::Typespecs::Float + build_number_typedef(typedef, "float_number", "Float", "float") + when AST::Typespecs::Hyper + build_number_typedef(typedef, "integer", "HyperInt", "datum") + when AST::Typespecs::Int + build_number_typedef(typedef, "integer", "Int", "datum") + when AST::Typespecs::Opaque + if type.fixed? + build_opaque_typedef(typedef, "Opaque", "FixedOpaque", type.size, is_struct) + else + type.size ? build_opaque_typedef(typedef, "VariableOpaque", "VariableOpaque", type.size, is_struct) : build_opaque_typedef(typedef, "VariableOpaque", "VariableOpaque", is_struct) + end + when AST::Typespecs::Quadruple + raise "no quadruple support in elixir" + when AST::Typespecs::String + build_string_typedef(typedef, is_struct) + when AST::Typespecs::UnsignedHyper + build_number_typedef(typedef, "non_neg_integer", "HyperUInt", "datum") + when AST::Typespecs::UnsignedInt + build_number_typedef(typedef, "non_neg_integer", "UInt", "datum") + else + build_simple_typedef(typedef, base_type, typedef.name, is_struct) + end end end + + def name(named) + parent = name named.parent_defn if named.is_a?(AST::Concerns::NestedDefinition) + result = named.name.camelize + "#{parent}#{result}" + end end end end diff --git a/spec/output/generator_spec_elixir/block_comments.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/block_comments.x/MyXDR_generated.ex deleted file mode 100644 index 74b1ed54b..000000000 --- a/spec/output/generator_spec_elixir/block_comments.x/MyXDR_generated.ex +++ /dev/null @@ -1,19 +0,0 @@ -defmodule MyXDR do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - """ - - comment ~S""" - XDR Source Code:: - - enum AccountFlags - { // masks for each flag - AUTH_REQUIRED_FLAG = 0x1 - }; - """ - - -end diff --git a/spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex deleted file mode 100644 index 182422814..000000000 --- a/spec/output/generator_spec_elixir/const.x/MyXDR_generated.ex +++ /dev/null @@ -1,31 +0,0 @@ -defmodule MyXDR do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - """ - - comment ~S""" - XDR Source Code:: - - const FOO = 1; - """ - - define_type("FOO", Const, 1); - - comment ~S""" - XDR Source Code:: - - typedef int TestArray[FOO]; - """ - - - comment ~S""" - XDR Source Code:: - - typedef int TestArray2; - """ - - -end diff --git a/spec/output/generator_spec_elixir/const.x/test_array.ex b/spec/output/generator_spec_elixir/const.x/test_array.ex new file mode 100644 index 000000000..6ff5cc768 --- /dev/null +++ b/spec/output/generator_spec_elixir/const.x/test_array.ex @@ -0,0 +1,59 @@ +defmodule MyXDR.TestArray do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `TestArray` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.Int + + @length "FOO" + + @array_type Int + + @array_spec %{type: @array_type, length: @length} + + @type t :: %__MODULE__{items: list(Int.t())} + + defstruct [:items] + + @spec new(items :: list(Int.t())) :: t() + def new(items), do: %__MODULE__{items: items} + + @impl true + def encode_xdr(%__MODULE__{items: items}) do + items + |> XDR.FixedArray.new(@array_type, @length) + |> XDR.FixedArray.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{items: items}) do + items + |> XDR.FixedArray.new(@array_type, @length) + |> XDR.FixedArray.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @array_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedArray.decode_xdr(bytes, spec) do + {:ok, {items, rest}} -> {:ok, {new(items), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @array_spec) + + def decode_xdr!(bytes, spec) do + {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {new(items), rest} + end +end diff --git a/spec/output/generator_spec_elixir/const.x/test_array2.ex b/spec/output/generator_spec_elixir/const.x/test_array2.ex new file mode 100644 index 000000000..56e056202 --- /dev/null +++ b/spec/output/generator_spec_elixir/const.x/test_array2.ex @@ -0,0 +1,59 @@ +defmodule MyXDR.TestArray2 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `TestArray2` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.Int + + @max_length "FOO" + + @array_type Int + + @array_spec %{type: @array_type, max_length: @max_length} + + @type t :: %__MODULE__{items: list(Int.t())} + + defstruct [:items] + + @spec new(items :: list(Int.t())) :: t() + def new(items), do: %__MODULE__{items: items} + + @impl true + def encode_xdr(%__MODULE__{items: items}) do + items + |> XDR.VariableArray.new(@array_type, @max_length) + |> XDR.VariableArray.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{items: items}) do + items + |> XDR.VariableArray.new(@array_type, @max_length) + |> XDR.VariableArray.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @array_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableArray.decode_xdr(bytes, spec) do + {:ok, {items, rest}} -> {:ok, {new(items), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @array_spec) + + def decode_xdr!(bytes, spec) do + {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {new(items), rest} + end +end diff --git a/spec/output/generator_spec_elixir/const.x/testarray.ex b/spec/output/generator_spec_elixir/const.x/testarray.ex deleted file mode 100644 index 1cc29fd1d..000000000 --- a/spec/output/generator_spec_elixir/const.x/testarray.ex +++ /dev/null @@ -1,47 +0,0 @@ -defmodule MyXDR.Testarray do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - - Representation of Stellar `Testarray` type. - """ - - @behaviour XDR.Declaration - - @type t :: %__MODULE__{datum: integer()} - - defstruct [:datum] - - @spec new(value :: integer()) :: t() - def new(value), do: %__MODULE__{datum: value} - - @impl true - def encode_xdr(%__MODULE__{datum: value}) do - XDR.Int.encode_xdr(%XDR.Int{datum: value}) - end - - @impl true - def encode_xdr!(%__MODULE__{datum: value}) do - XDR.Int.encode_xdr!(%XDR.Int{datum: value}) - end - - @impl true - def decode_xdr(bytes, term \\ nil) - - def decode_xdr(bytes, _term) do - case XDR.Int.decode_xdr(bytes) do - {:ok, {%XDR.Int{datum: value}, rest}} -> {:ok, {new(value), rest}} - error -> error - end - end - - @impl true - def decode_xdr!(bytes, term \\ nil) - - def decode_xdr!(bytes, _term) do - {%XDR.Int{datum: value}, rest} = XDR.Int.decode_xdr!(bytes) - {new(value), rest} - end -end diff --git a/spec/output/generator_spec_elixir/const.x/testarray2.ex b/spec/output/generator_spec_elixir/const.x/testarray2.ex deleted file mode 100644 index 4b016b8e3..000000000 --- a/spec/output/generator_spec_elixir/const.x/testarray2.ex +++ /dev/null @@ -1,47 +0,0 @@ -defmodule MyXDR.Testarray2 do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - - Representation of Stellar `Testarray2` type. - """ - - @behaviour XDR.Declaration - - @type t :: %__MODULE__{datum: integer()} - - defstruct [:datum] - - @spec new(value :: integer()) :: t() - def new(value), do: %__MODULE__{datum: value} - - @impl true - def encode_xdr(%__MODULE__{datum: value}) do - XDR.Int.encode_xdr(%XDR.Int{datum: value}) - end - - @impl true - def encode_xdr!(%__MODULE__{datum: value}) do - XDR.Int.encode_xdr!(%XDR.Int{datum: value}) - end - - @impl true - def decode_xdr(bytes, term \\ nil) - - def decode_xdr(bytes, _term) do - case XDR.Int.decode_xdr(bytes) do - {:ok, {%XDR.Int{datum: value}, rest}} -> {:ok, {new(value), rest}} - error -> error - end - end - - @impl true - def decode_xdr!(bytes, term \\ nil) - - def decode_xdr!(bytes, _term) do - {%XDR.Int{datum: value}, rest} = XDR.Int.decode_xdr!(bytes) - {new(value), rest} - end -end diff --git a/spec/output/generator_spec_elixir/enum.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/enum.x/MyXDR_generated.ex deleted file mode 100644 index fa3f1c52b..000000000 --- a/spec/output/generator_spec_elixir/enum.x/MyXDR_generated.ex +++ /dev/null @@ -1,60 +0,0 @@ -defmodule MyXDR do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - """ - - comment ~S""" - XDR Source Code:: - - enum MessageType - { - ERROR_MSG, - HELLO, - DONT_HAVE, - - GET_PEERS, // gets a list of peers this guy knows about - PEERS, - - GET_TX_SET, // gets a particular txset by hash - TX_SET, - - GET_VALIDATIONS, // gets validations for a given ledger hash - VALIDATIONS, - - TRANSACTION, //pass on a tx you have heard about - JSON_TRANSACTION, - - // FBA - GET_FBA_QUORUMSET, - FBA_QUORUMSET, - FBA_MESSAGE - }; - """ - - - comment ~S""" - XDR Source Code:: - - enum Color { - RED=0, - GREEN=1, - BLUE=2 - }; - """ - - - comment ~S""" - XDR Source Code:: - - enum Color2 { - RED2=RED, - GREEN2=1, - BLUE2=2 - }; - """ - - -end diff --git a/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex deleted file mode 100644 index 483f7f1ea..000000000 --- a/spec/output/generator_spec_elixir/nesting.x/MyXDR_generated.ex +++ /dev/null @@ -1,68 +0,0 @@ -defmodule MyXDR do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - """ - - comment ~S""" - XDR Source Code:: - - enum UnionKey { - ONE = 1, - TWO = 2, - OFFER = 3 - }; - """ - - - comment ~S""" - XDR Source Code:: - - typedef int Foo; - """ - - - comment ~S""" - XDR Source Code:: - - struct { - int someInt; - } - """ - - - comment ~S""" - XDR Source Code:: - - struct { - int someInt; - Foo foo; - } - """ - - - comment ~S""" - XDR Source Code:: - - union MyUnion switch (UnionKey type) - { - case ONE: - struct { - int someInt; - } one; - - case TWO: - struct { - int someInt; - Foo foo; - } two; - - case OFFER: - void; - }; - """ - - -end diff --git a/spec/output/generator_spec_elixir/nesting.x/one.ex b/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex similarity index 92% rename from spec/output/generator_spec_elixir/nesting.x/one.ex rename to spec/output/generator_spec_elixir/nesting.x/my_union_one.ex index 4229111cf..534961876 100644 --- a/spec/output/generator_spec_elixir/nesting.x/one.ex +++ b/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex @@ -1,16 +1,18 @@ -defmodule MyXDR.One do +defmodule MyXDR.MyUnionOne do @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - Representation of Stellar `One` type. + Representation of Stellar `MyUnionOne` type. """ @behaviour XDR.Declaration - alias MyXDR.{Int} + alias MyXDR.{ + Int + } @struct_spec XDR.Struct.new( some_int: Int diff --git a/spec/output/generator_spec_elixir/nesting.x/two.ex b/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex similarity index 92% rename from spec/output/generator_spec_elixir/nesting.x/two.ex rename to spec/output/generator_spec_elixir/nesting.x/my_union_two.ex index e335c6dea..8e368cdcc 100644 --- a/spec/output/generator_spec_elixir/nesting.x/two.ex +++ b/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex @@ -1,16 +1,19 @@ -defmodule MyXDR.Two do +defmodule MyXDR.MyUnionTwo do @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - Representation of Stellar `Two` type. + Representation of Stellar `MyUnionTwo` type. """ @behaviour XDR.Declaration - alias MyXDR.{Int, Foo} + alias MyXDR.{ + Int, + Foo + } @struct_spec XDR.Struct.new( some_int: Int, diff --git a/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex deleted file mode 100644 index c96405769..000000000 --- a/spec/output/generator_spec_elixir/optional.x/MyXDR_generated.ex +++ /dev/null @@ -1,28 +0,0 @@ -defmodule MyXDR do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - """ - - comment ~S""" - XDR Source Code:: - - typedef int Arr[2]; - """ - - - comment ~S""" - XDR Source Code:: - - struct HasOptions - { - int* firstOption; - int *secondOption; - Arr *thirdOption; - }; - """ - - -end diff --git a/spec/output/generator_spec_elixir/optional.x/arr.ex b/spec/output/generator_spec_elixir/optional.x/arr.ex index 5862e7aa4..78949374d 100644 --- a/spec/output/generator_spec_elixir/optional.x/arr.ex +++ b/spec/output/generator_spec_elixir/optional.x/arr.ex @@ -10,38 +10,50 @@ defmodule MyXDR.Arr do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: integer()} + alias MyXDR.Int - defstruct [:datum] + @length 2 - @spec new(value :: integer()) :: t() - def new(value), do: %__MODULE__{datum: value} + @array_type Int + + @array_spec %{type: @array_type, length: @length} + + @type t :: %__MODULE__{items: list(Int.t())} + + defstruct [:items] + + @spec new(items :: list(Int.t())) :: t() + def new(items), do: %__MODULE__{items: items} @impl true - def encode_xdr(%__MODULE__{datum: value}) do - XDR.Int.encode_xdr(%XDR.Int{datum: value}) + def encode_xdr(%__MODULE__{items: items}) do + items + |> XDR.FixedArray.new(@array_type, @length) + |> XDR.FixedArray.encode_xdr() end @impl true - def encode_xdr!(%__MODULE__{datum: value}) do - XDR.Int.encode_xdr!(%XDR.Int{datum: value}) + def encode_xdr!(%__MODULE__{items: items}) do + items + |> XDR.FixedArray.new(@array_type, @length) + |> XDR.FixedArray.encode_xdr!() end @impl true - def decode_xdr(bytes, term \\ nil) + def decode_xdr(bytes, spec \\ @array_spec) - def decode_xdr(bytes, _term) do - case XDR.Int.decode_xdr(bytes) do - {:ok, {%XDR.Int{datum: value}, rest}} -> {:ok, {new(value), rest}} + def decode_xdr(bytes, spec) do + case XDR.FixedArray.decode_xdr(bytes, spec) do + {:ok, {items, rest}} -> {:ok, {new(items), rest}} error -> error end end @impl true - def decode_xdr!(bytes, term \\ nil) + def decode_xdr!(bytes, spec \\ @array_spec) - def decode_xdr!(bytes, _term) do - {%XDR.Int{datum: value}, rest} = XDR.Int.decode_xdr!(bytes) - {new(value), rest} + def decode_xdr!(bytes, spec) do + {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {new(items), rest} end end diff --git a/spec/output/generator_spec_elixir/optional.x/has_options.ex b/spec/output/generator_spec_elixir/optional.x/has_options.ex index 32c5d2cc3..966d48e25 100644 --- a/spec/output/generator_spec_elixir/optional.x/has_options.ex +++ b/spec/output/generator_spec_elixir/optional.x/has_options.ex @@ -10,7 +10,10 @@ defmodule MyXDR.HasOptions do @behaviour XDR.Declaration - alias MyXDR.{OptionalInt, OptionalInt, OptionalArr} + alias MyXDR.{ + OptionalInt, + OptionalArr + } @struct_spec XDR.Struct.new( first_option: OptionalInt, diff --git a/spec/output/generator_spec_elixir/optional.x/optional_arr.ex b/spec/output/generator_spec_elixir/optional.x/optional_arr.ex new file mode 100644 index 000000000..156ee44ff --- /dev/null +++ b/spec/output/generator_spec_elixir/optional.x/optional_arr.ex @@ -0,0 +1,59 @@ +defmodule MyXDR.OptionalArr do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `OptionalArr` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.Arr + + @optional_spec XDR.Optional.new(Arr) + + @type arr :: Arr.t() | nil + + @type t :: %__MODULE__{arr: arr()} + + defstruct [:arr] + + @spec new(arr :: arr()) :: t() + def new(arr \\ nil), do: %__MODULE__{arr: arr} + + @impl true + def encode_xdr(%__MODULE__{arr: arr}) do + arr + |> XDR.Optional.new() + |> XDR.Optional.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{arr: arr}) do + arr + |> XDR.Optional.new() + |> XDR.Optional.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, optional_spec \\ @optional_spec) + + def decode_xdr(bytes, optional_spec) do + case XDR.Optional.decode_xdr(bytes, optional_spec) do + {:ok, {%XDR.Optional{type: arr}, rest}} -> {:ok, {new(arr), rest}} + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, optional_spec \\ @optional_spec) + + def decode_xdr!(bytes, optional_spec) do + {%XDR.Optional{identifier: arr}, rest} = XDR.Optional.decode_xdr!(bytes) + {new(arr), rest} + {nil, rest} -> {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/optional.x/optional_int.ex b/spec/output/generator_spec_elixir/optional.x/optional_int.ex new file mode 100644 index 000000000..df6218096 --- /dev/null +++ b/spec/output/generator_spec_elixir/optional.x/optional_int.ex @@ -0,0 +1,59 @@ +defmodule MyXDR.OptionalInt do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `OptionalInt` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.Int + + @optional_spec XDR.Optional.new(Int) + + @type int :: Int.t() | nil + + @type t :: %__MODULE__{int: int()} + + defstruct [:int] + + @spec new(int :: int()) :: t() + def new(int \\ nil), do: %__MODULE__{int: int} + + @impl true + def encode_xdr(%__MODULE__{int: int}) do + int + |> XDR.Optional.new() + |> XDR.Optional.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{int: int}) do + int + |> XDR.Optional.new() + |> XDR.Optional.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, optional_spec \\ @optional_spec) + + def decode_xdr(bytes, optional_spec) do + case XDR.Optional.decode_xdr(bytes, optional_spec) do + {:ok, {%XDR.Optional{type: int}, rest}} -> {:ok, {new(int), rest}} + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, optional_spec \\ @optional_spec) + + def decode_xdr!(bytes, optional_spec) do + {%XDR.Optional{identifier: int}, rest} = XDR.Optional.decode_xdr!(bytes) + {new(int), rest} + {nil, rest} -> {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex deleted file mode 100644 index f5897ea44..000000000 --- a/spec/output/generator_spec_elixir/struct.x/MyXDR_generated.ex +++ /dev/null @@ -1,30 +0,0 @@ -defmodule MyXDR do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - """ - - comment ~S""" - XDR Source Code:: - - typedef hyper int64; - """ - - - comment ~S""" - XDR Source Code:: - - struct MyStruct - { - int someInt; - int64 aBigInt; - opaque someOpaque[10]; - string someString<>; - string maxString<100>; - }; - """ - - -end diff --git a/spec/output/generator_spec_elixir/struct.x/my_struct.ex b/spec/output/generator_spec_elixir/struct.x/my_struct.ex index 586b57e9c..c42c67ed1 100644 --- a/spec/output/generator_spec_elixir/struct.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/struct.x/my_struct.ex @@ -10,19 +10,25 @@ defmodule MyXDR.MyStruct do @behaviour XDR.Declaration - alias MyXDR.{Int, Int64, FixedOpaque10, String, String100} + alias MyXDR.{ + Int, + Int64, + Opaque10, + String, + String100 + } @struct_spec XDR.Struct.new( some_int: Int, a_big_int: Int64, - some_opaque: FixedOpaque10, + some_opaque: Opaque10, some_string: String, max_string: String100 ) @type some_int :: Int.t() @type a_big_int :: Int64.t() - @type some_opaque :: FixedOpaque10.t() + @type some_opaque :: Opaque10.t() @type some_string :: String.t() @type max_string :: String100.t() @@ -34,7 +40,7 @@ defmodule MyXDR.MyStruct do def new( %Int{} = some_int, %Int64{} = a_big_int, - %FixedOpaque10{} = some_opaque, + %Opaque10{} = some_opaque, %String{} = some_string, %String100{} = max_string ), diff --git a/spec/output/generator_spec_elixir/struct.x/opaque10.ex b/spec/output/generator_spec_elixir/struct.x/opaque10.ex new file mode 100644 index 000000000..02dc7a497 --- /dev/null +++ b/spec/output/generator_spec_elixir/struct.x/opaque10.ex @@ -0,0 +1,51 @@ +defmodule MyXDR.Opaque10 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Opaque10` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length 10 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes) + {new(opaque), rest} + end +end diff --git a/spec/output/generator_spec_elixir/struct.x/string100.ex b/spec/output/generator_spec_elixir/struct.x/string100.ex new file mode 100644 index 000000000..fc11da7b7 --- /dev/null +++ b/spec/output/generator_spec_elixir/struct.x/string100.ex @@ -0,0 +1,53 @@ +defmodule MyXDR.String100 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `String100` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @max_lenght 100 + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new(@max_length) + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new(@max_length) + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex deleted file mode 100644 index 71f97e182..000000000 --- a/spec/output/generator_spec_elixir/test.x/MyXDR_generated.ex +++ /dev/null @@ -1,234 +0,0 @@ -defmodule MyXDR do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - """ - - comment ~S""" - XDR Source Code:: - - typedef opaque uint512[64]; - """ - - - comment ~S""" - XDR Source Code:: - - typedef opaque uint513<64>; - """ - - - comment ~S""" - XDR Source Code:: - - typedef opaque uint514<>; - """ - - - comment ~S""" - XDR Source Code:: - - typedef string str<64>; - """ - - - comment ~S""" - XDR Source Code:: - - typedef string str2<>; - """ - - - comment ~S""" - XDR Source Code:: - - typedef opaque Hash[32]; - """ - - - comment ~S""" - XDR Source Code:: - - typedef Hash Hashes1[12]; - """ - - - comment ~S""" - XDR Source Code:: - - typedef Hash Hashes2<12>; - """ - - - comment ~S""" - XDR Source Code:: - - typedef Hash Hashes3<>; - """ - - - comment ~S""" - XDR Source Code:: - - typedef Hash *optHash1; - """ - - - comment ~S""" - XDR Source Code:: - - typedef Hash* optHash2; - """ - - - comment ~S""" - XDR Source Code:: - - typedef int int1; - """ - - - comment ~S""" - XDR Source Code:: - - typedef hyper int2; - """ - - - comment ~S""" - XDR Source Code:: - - typedef unsigned int int3; - """ - - - comment ~S""" - XDR Source Code:: - - typedef unsigned hyper int4; - """ - - - comment ~S""" - XDR Source Code:: - - struct MyStruct - { - uint512 field1; - optHash1 field2; - int1 field3; - unsigned int field4; - float field5; - double field6; - bool field7; - }; - """ - - - comment ~S""" - XDR Source Code:: - - struct LotsOfMyStructs - { - MyStruct members<>; - }; - """ - - - comment ~S""" - XDR Source Code:: - - struct HasStuff - { - LotsOfMyStructs data; - }; - """ - - - comment ~S""" - XDR Source Code:: - - enum Color { - RED, - BLUE = 5, - GREEN - }; - """ - - - comment ~S""" - XDR Source Code:: - - const FOO = 1244; - """ - - define_type("FOO", Const, 1244); - - comment ~S""" - XDR Source Code:: - - const BAR = FOO; - """ - - define_type("BAR", Const, FOO); - - comment ~S""" - XDR Source Code:: - - enum { - BLAH_1, - BLAH_2 - } - """ - - - comment ~S""" - XDR Source Code:: - - struct { - int blah; - } - """ - - - comment ~S""" - XDR Source Code:: - - union switch (Color color) { - case RED: - void; - default: - int blah2; - } - """ - - - comment ~S""" - XDR Source Code:: - - struct Nester - { - enum { - BLAH_1, - BLAH_2 - } nestedEnum; - - struct { - int blah; - } nestedStruct; - - union switch (Color color) { - case RED: - void; - default: - int blah2; - } nestedUnion; - - - }; - """ - - -end diff --git a/spec/output/generator_spec_elixir/test.x/has_stuff.ex b/spec/output/generator_spec_elixir/test.x/has_stuff.ex index 54accd685..03f3f6581 100644 --- a/spec/output/generator_spec_elixir/test.x/has_stuff.ex +++ b/spec/output/generator_spec_elixir/test.x/has_stuff.ex @@ -10,7 +10,9 @@ defmodule MyXDR.HasStuff do @behaviour XDR.Declaration - alias MyXDR.{LotsOfMyStructs} + alias MyXDR.{ + LotsOfMyStructs + } @struct_spec XDR.Struct.new( data: LotsOfMyStructs diff --git a/spec/output/generator_spec_elixir/test.x/hash.ex b/spec/output/generator_spec_elixir/test.x/hash.ex index bd7b0cacc..74f35b253 100644 --- a/spec/output/generator_spec_elixir/test.x/hash.ex +++ b/spec/output/generator_spec_elixir/test.x/hash.ex @@ -10,4 +10,44 @@ defmodule MyXDR.Hash do @behaviour XDR.Declaration + alias MyXDR.Opaque32 + + @type t :: %__MODULE__{value: binary()} + + defstruct [:value] + + @spec new(value :: binary()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> Opaque32.new() + |> Opaque32.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + value + |> Opaque32.new() + |> Opaque32.encode_xdr() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Opaque32.decode_xdr(bytes, term) do + {:ok, {%XDR.Opaque32{opaque: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Opaque32{opaque: value}, rest} = XDR.Opaque32.decode_xdr!(bytes) + {new(value), rest} + end end diff --git a/spec/output/generator_spec_elixir/test.x/hashes1.ex b/spec/output/generator_spec_elixir/test.x/hashes1.ex index a56834338..2173d3477 100644 --- a/spec/output/generator_spec_elixir/test.x/hashes1.ex +++ b/spec/output/generator_spec_elixir/test.x/hashes1.ex @@ -10,4 +10,50 @@ defmodule MyXDR.Hashes1 do @behaviour XDR.Declaration + alias MyXDR.Hash + + @length 12 + + @array_type Hash + + @array_spec %{type: @array_type, length: @length} + + @type t :: %__MODULE__{items: list(Hash.t())} + + defstruct [:items] + + @spec new(items :: list(Hash.t())) :: t() + def new(items), do: %__MODULE__{items: items} + + @impl true + def encode_xdr(%__MODULE__{items: items}) do + items + |> XDR.FixedArray.new(@array_type, @length) + |> XDR.FixedArray.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{items: items}) do + items + |> XDR.FixedArray.new(@array_type, @length) + |> XDR.FixedArray.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @array_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedArray.decode_xdr(bytes, spec) do + {:ok, {items, rest}} -> {:ok, {new(items), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @array_spec) + + def decode_xdr!(bytes, spec) do + {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {new(items), rest} + end end diff --git a/spec/output/generator_spec_elixir/test.x/hashes2.ex b/spec/output/generator_spec_elixir/test.x/hashes2.ex index 2bbccef76..1f8612f47 100644 --- a/spec/output/generator_spec_elixir/test.x/hashes2.ex +++ b/spec/output/generator_spec_elixir/test.x/hashes2.ex @@ -10,4 +10,50 @@ defmodule MyXDR.Hashes2 do @behaviour XDR.Declaration + alias MyXDR.Hash + + @max_length 12 + + @array_type Hash + + @array_spec %{type: @array_type, max_length: @max_length} + + @type t :: %__MODULE__{items: list(Hash.t())} + + defstruct [:items] + + @spec new(items :: list(Hash.t())) :: t() + def new(items), do: %__MODULE__{items: items} + + @impl true + def encode_xdr(%__MODULE__{items: items}) do + items + |> XDR.VariableArray.new(@array_type, @max_length) + |> XDR.VariableArray.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{items: items}) do + items + |> XDR.VariableArray.new(@array_type, @max_length) + |> XDR.VariableArray.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @array_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableArray.decode_xdr(bytes, spec) do + {:ok, {items, rest}} -> {:ok, {new(items), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @array_spec) + + def decode_xdr!(bytes, spec) do + {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {new(items), rest} + end end diff --git a/spec/output/generator_spec_elixir/test.x/hashes3.ex b/spec/output/generator_spec_elixir/test.x/hashes3.ex index 238d9aaf1..f88f79c04 100644 --- a/spec/output/generator_spec_elixir/test.x/hashes3.ex +++ b/spec/output/generator_spec_elixir/test.x/hashes3.ex @@ -10,4 +10,50 @@ defmodule MyXDR.Hashes3 do @behaviour XDR.Declaration + alias MyXDR.Hash + + @max_length 2147483647 + + @array_type Hash + + @array_spec %{type: @array_type, max_length: @max_length} + + @type t :: %__MODULE__{items: list(Hash.t())} + + defstruct [:items] + + @spec new(items :: list(Hash.t())) :: t() + def new(items), do: %__MODULE__{items: items} + + @impl true + def encode_xdr(%__MODULE__{items: items}) do + items + |> XDR.VariableArray.new(@array_type, @max_length) + |> XDR.VariableArray.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{items: items}) do + items + |> XDR.VariableArray.new(@array_type, @max_length) + |> XDR.VariableArray.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @array_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableArray.decode_xdr(bytes, spec) do + {:ok, {items, rest}} -> {:ok, {new(items), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @array_spec) + + def decode_xdr!(bytes, spec) do + {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {new(items), rest} + end end diff --git a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex index 828d13be8..2947a5900 100644 --- a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex +++ b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex @@ -10,7 +10,9 @@ defmodule MyXDR.LotsOfMyStructs do @behaviour XDR.Declaration - alias MyXDR.{MyStructList} + alias MyXDR.{ + MyStructList + } @struct_spec XDR.Struct.new( members: MyStructList diff --git a/spec/output/generator_spec_elixir/test.x/my_struct.ex b/spec/output/generator_spec_elixir/test.x/my_struct.ex index 975e679fe..b4a07969f 100644 --- a/spec/output/generator_spec_elixir/test.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/test.x/my_struct.ex @@ -10,7 +10,15 @@ defmodule MyXDR.MyStruct do @behaviour XDR.Declaration - alias MyXDR.{Uint512, OptHash1, Int1, UInt, Float, DoubleFloat, Bool} + alias MyXDR.{ + Uint512, + OptHash1, + Int1, + UInt, + Float, + DoubleFloat, + Bool + } @struct_spec XDR.Struct.new( field1: Uint512, diff --git a/spec/output/generator_spec_elixir/test.x/nester.ex b/spec/output/generator_spec_elixir/test.x/nester.ex index 268e81140..f62a243e9 100644 --- a/spec/output/generator_spec_elixir/test.x/nester.ex +++ b/spec/output/generator_spec_elixir/test.x/nester.ex @@ -10,7 +10,11 @@ defmodule MyXDR.Nester do @behaviour XDR.Declaration - alias MyXDR.{NesterNestedEnum, NesterNestedStruct, NesterNestedUnion} + alias MyXDR.{ + NesterNestedEnum, + NesterNestedStruct, + NesterNestedUnion + } @struct_spec XDR.Struct.new( nested_enum: NesterNestedEnum, diff --git a/spec/output/generator_spec_elixir/test.x/nested_enum.ex b/spec/output/generator_spec_elixir/test.x/nester_nested_enum.ex similarity index 93% rename from spec/output/generator_spec_elixir/test.x/nested_enum.ex rename to spec/output/generator_spec_elixir/test.x/nester_nested_enum.ex index ee8c5570f..de887c08c 100644 --- a/spec/output/generator_spec_elixir/test.x/nested_enum.ex +++ b/spec/output/generator_spec_elixir/test.x/nester_nested_enum.ex @@ -1,11 +1,11 @@ -defmodule MyXDR.NestedEnum do +defmodule MyXDR.NesterNestedEnum do @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - Representation of Stellar `NestedEnum` type. + Representation of Stellar `NesterNestedEnum` type. """ @behaviour XDR.Declaration diff --git a/spec/output/generator_spec_elixir/test.x/nested_struct.ex b/spec/output/generator_spec_elixir/test.x/nester_nested_struct.ex similarity index 91% rename from spec/output/generator_spec_elixir/test.x/nested_struct.ex rename to spec/output/generator_spec_elixir/test.x/nester_nested_struct.ex index 4cb32bccc..cef0c6419 100644 --- a/spec/output/generator_spec_elixir/test.x/nested_struct.ex +++ b/spec/output/generator_spec_elixir/test.x/nester_nested_struct.ex @@ -1,16 +1,18 @@ -defmodule MyXDR.NestedStruct do +defmodule MyXDR.NesterNestedStruct do @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - Representation of Stellar `NestedStruct` type. + Representation of Stellar `NesterNestedStruct` type. """ @behaviour XDR.Declaration - alias MyXDR.{Int} + alias MyXDR.{ + Int + } @struct_spec XDR.Struct.new( blah: Int diff --git a/spec/output/generator_spec_elixir/test.x/nested_union.ex b/spec/output/generator_spec_elixir/test.x/nester_nested_union.ex similarity index 94% rename from spec/output/generator_spec_elixir/test.x/nested_union.ex rename to spec/output/generator_spec_elixir/test.x/nester_nested_union.ex index d5cb49b06..e6fca7277 100644 --- a/spec/output/generator_spec_elixir/test.x/nested_union.ex +++ b/spec/output/generator_spec_elixir/test.x/nester_nested_union.ex @@ -1,11 +1,11 @@ -defmodule MyXDR.NestedUnion do +defmodule MyXDR.NesterNestedUnion do @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - Representation of Stellar `NestedUnion` type. + Representation of Stellar `NesterNestedUnion` type. """ @behaviour XDR.Declaration diff --git a/spec/output/generator_spec_elixir/test.x/opaque32.ex b/spec/output/generator_spec_elixir/test.x/opaque32.ex new file mode 100644 index 000000000..7f6eeb03e --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/opaque32.ex @@ -0,0 +1,51 @@ +defmodule MyXDR.Opaque32 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Opaque32` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length 32 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes) + {new(opaque), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/opaque64.ex b/spec/output/generator_spec_elixir/test.x/opaque64.ex new file mode 100644 index 000000000..1cbbdaa2f --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/opaque64.ex @@ -0,0 +1,51 @@ +defmodule MyXDR.Opaque64 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `Opaque64` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @length 64 + + @opaque_spec XDR.FixedOpaque.new(nil, @length) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.FixedOpaque.encode_xdr!(%XDR.FixedOpaque{opaque: opaque, length: @length}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.FixedOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.FixedOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes) + {new(opaque), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/opt_hash1.ex b/spec/output/generator_spec_elixir/test.x/opt_hash1.ex new file mode 100644 index 000000000..c3c1e6128 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/opt_hash1.ex @@ -0,0 +1,59 @@ +defmodule MyXDR.OptHash1 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `OptHash1` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.Hash + + @optional_spec XDR.Optional.new(Hash) + + @type hash :: Hash.t() | nil + + @type t :: %__MODULE__{hash: hash()} + + defstruct [:hash] + + @spec new(hash :: hash()) :: t() + def new(hash \\ nil), do: %__MODULE__{hash: hash} + + @impl true + def encode_xdr(%__MODULE__{hash: hash}) do + hash + |> XDR.Optional.new() + |> XDR.Optional.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{hash: hash}) do + hash + |> XDR.Optional.new() + |> XDR.Optional.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, optional_spec \\ @optional_spec) + + def decode_xdr(bytes, optional_spec) do + case XDR.Optional.decode_xdr(bytes, optional_spec) do + {:ok, {%XDR.Optional{type: hash}, rest}} -> {:ok, {new(hash), rest}} + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, optional_spec \\ @optional_spec) + + def decode_xdr!(bytes, optional_spec) do + {%XDR.Optional{identifier: hash}, rest} = XDR.Optional.decode_xdr!(bytes) + {new(hash), rest} + {nil, rest} -> {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/opt_hash2.ex b/spec/output/generator_spec_elixir/test.x/opt_hash2.ex new file mode 100644 index 000000000..d02c19783 --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/opt_hash2.ex @@ -0,0 +1,59 @@ +defmodule MyXDR.OptHash2 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `OptHash2` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.Hash + + @optional_spec XDR.Optional.new(Hash) + + @type hash :: Hash.t() | nil + + @type t :: %__MODULE__{hash: hash()} + + defstruct [:hash] + + @spec new(hash :: hash()) :: t() + def new(hash \\ nil), do: %__MODULE__{hash: hash} + + @impl true + def encode_xdr(%__MODULE__{hash: hash}) do + hash + |> XDR.Optional.new() + |> XDR.Optional.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{hash: hash}) do + hash + |> XDR.Optional.new() + |> XDR.Optional.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, optional_spec \\ @optional_spec) + + def decode_xdr(bytes, optional_spec) do + case XDR.Optional.decode_xdr(bytes, optional_spec) do + {:ok, {%XDR.Optional{type: hash}, rest}} -> {:ok, {new(hash), rest}} + {:ok, {nil, rest}} -> {:ok, {new(), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, optional_spec \\ @optional_spec) + + def decode_xdr!(bytes, optional_spec) do + {%XDR.Optional{identifier: hash}, rest} = XDR.Optional.decode_xdr!(bytes) + {new(hash), rest} + {nil, rest} -> {new(), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/opthash1.ex b/spec/output/generator_spec_elixir/test.x/opthash1.ex deleted file mode 100644 index 5c1539269..000000000 --- a/spec/output/generator_spec_elixir/test.x/opthash1.ex +++ /dev/null @@ -1,13 +0,0 @@ -defmodule MyXDR.Opthash1 do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - - Representation of Stellar `Opthash1` type. - """ - - @behaviour XDR.Declaration - -end diff --git a/spec/output/generator_spec_elixir/test.x/opthash2.ex b/spec/output/generator_spec_elixir/test.x/opthash2.ex deleted file mode 100644 index 27eb71c17..000000000 --- a/spec/output/generator_spec_elixir/test.x/opthash2.ex +++ /dev/null @@ -1,13 +0,0 @@ -defmodule MyXDR.Opthash2 do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - - Representation of Stellar `Opthash2` type. - """ - - @behaviour XDR.Declaration - -end diff --git a/spec/output/generator_spec_elixir/test.x/str.ex b/spec/output/generator_spec_elixir/test.x/str.ex index e70cefe21..78aecf45d 100644 --- a/spec/output/generator_spec_elixir/test.x/str.ex +++ b/spec/output/generator_spec_elixir/test.x/str.ex @@ -10,4 +10,44 @@ defmodule MyXDR.Str do @behaviour XDR.Declaration + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @max_lenght 64 + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new(@max_length) + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new(@max_length) + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end end diff --git a/spec/output/generator_spec_elixir/test.x/str2.ex b/spec/output/generator_spec_elixir/test.x/str2.ex index 23aab75a0..ae8e9e271 100644 --- a/spec/output/generator_spec_elixir/test.x/str2.ex +++ b/spec/output/generator_spec_elixir/test.x/str2.ex @@ -10,4 +10,42 @@ defmodule MyXDR.Str2 do @behaviour XDR.Declaration + @type t :: %__MODULE__{value: String.t()} + + defstruct [:value] + + @spec new(value :: String.t()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{value: value}) do + value + |> XDR.String.new() + |> XDR.String.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.String.decode_xdr(bytes) do + {:ok, {%XDR.String{string: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.String{string: value}, rest} = XDR.String.decode_xdr!(bytes) + {new(value), rest} + end end diff --git a/spec/output/generator_spec_elixir/test.x/uint512.ex b/spec/output/generator_spec_elixir/test.x/uint512.ex index 0df192380..3203ca252 100644 --- a/spec/output/generator_spec_elixir/test.x/uint512.ex +++ b/spec/output/generator_spec_elixir/test.x/uint512.ex @@ -10,4 +10,44 @@ defmodule MyXDR.Uint512 do @behaviour XDR.Declaration + alias MyXDR.Opaque64 + + @type t :: %__MODULE__{value: binary()} + + defstruct [:value] + + @spec new(value :: binary()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> Opaque64.new() + |> Opaque64.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + value + |> Opaque64.new() + |> Opaque64.encode_xdr() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.Opaque64.decode_xdr(bytes, term) do + {:ok, {%XDR.Opaque64{opaque: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.Opaque64{opaque: value}, rest} = XDR.Opaque64.decode_xdr!(bytes) + {new(value), rest} + end end diff --git a/spec/output/generator_spec_elixir/test.x/uint513.ex b/spec/output/generator_spec_elixir/test.x/uint513.ex index 37be2acc7..3d0c9927c 100644 --- a/spec/output/generator_spec_elixir/test.x/uint513.ex +++ b/spec/output/generator_spec_elixir/test.x/uint513.ex @@ -10,4 +10,44 @@ defmodule MyXDR.Uint513 do @behaviour XDR.Declaration + alias MyXDR.VariableOpaque64 + + @type t :: %__MODULE__{value: binary()} + + defstruct [:value] + + @spec new(value :: binary()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> VariableOpaque64.new() + |> VariableOpaque64.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + value + |> VariableOpaque64.new() + |> VariableOpaque64.encode_xdr() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.VariableOpaque64.decode_xdr(bytes, term) do + {:ok, {%XDR.VariableOpaque64{opaque: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.VariableOpaque64{opaque: value}, rest} = XDR.VariableOpaque64.decode_xdr!(bytes) + {new(value), rest} + end end diff --git a/spec/output/generator_spec_elixir/test.x/uint514.ex b/spec/output/generator_spec_elixir/test.x/uint514.ex index 4343a32f8..de53cf8e8 100644 --- a/spec/output/generator_spec_elixir/test.x/uint514.ex +++ b/spec/output/generator_spec_elixir/test.x/uint514.ex @@ -10,4 +10,44 @@ defmodule MyXDR.Uint514 do @behaviour XDR.Declaration + alias MyXDR.VariableOpaque + + @type t :: %__MODULE__{value: binary()} + + defstruct [:value] + + @spec new(value :: binary()) :: t() + def new(value), do: %__MODULE__{value: value} + + @impl true + def encode_xdr(%__MODULE__{value: value}) do + value + |> VariableOpaque.new() + |> VariableOpaque.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + value + |> VariableOpaque.new() + |> VariableOpaque.encode_xdr() + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case XDR.VariableOpaque.decode_xdr(bytes, term) do + {:ok, {%XDR.VariableOpaque{opaque: value}, rest}} -> {:ok, {new(value), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%XDR.VariableOpaque{opaque: value}, rest} = XDR.VariableOpaque.decode_xdr!(bytes) + {new(value), rest} + end end diff --git a/spec/output/generator_spec_elixir/test.x/variable_opaque64.ex b/spec/output/generator_spec_elixir/test.x/variable_opaque64.ex new file mode 100644 index 000000000..323c547bc --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/variable_opaque64.ex @@ -0,0 +1,51 @@ +defmodule MyXDR.VariableOpaque64 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `VariableOpaque64` type. + """ + + @behaviour XDR.Declaration + + @type t :: %__MODULE__{opaque: binary()} + + defstruct [:opaque] + + @max_size 64 + + @opaque_spec XDR.VariableOpaque.new(nil, @max_size) + + @spec new(opaque :: binary()) :: t() + def new(opaque), do: %__MODULE__{opaque: opaque} + + @impl true + def encode_xdr(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr(%XDR.VariableOpaque{opaque: opaque, max_size: @max_size}) + end + + @impl true + def encode_xdr!(%__MODULE__{opaque: opaque}) do + XDR.VariableOpaque.encode_xdr!(%XDR.VariableOpaque{opaque: opaque, max_size: @max_size}) + end + + @impl true + def decode_xdr(bytes, spec \\ @opaque_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableOpaque.decode_xdr(bytes, spec) do + {:ok, {%XDR.VariableOpaque{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @opaque_spec) + + def decode_xdr!(bytes, spec) do + {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes) + {new(opaque), rest} + end +end diff --git a/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex b/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex deleted file mode 100644 index 915b47c83..000000000 --- a/spec/output/generator_spec_elixir/union.x/MyXDR_generated.ex +++ /dev/null @@ -1,69 +0,0 @@ -defmodule MyXDR do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - """ - - comment ~S""" - XDR Source Code:: - - typedef int Error; - """ - - - comment ~S""" - XDR Source Code:: - - typedef int Multi; - """ - - - comment ~S""" - XDR Source Code:: - - enum UnionKey { - ERROR, - MULTI - }; - """ - - - comment ~S""" - XDR Source Code:: - - union MyUnion switch (UnionKey type) - { - case ERROR: - Error error; - case MULTI: - Multi things<>; - - - }; - """ - - - comment ~S""" - XDR Source Code:: - - union IntUnion switch (int type) - { - case 0: - Error error; - case 1: - Multi things<>; - - }; - """ - - - comment ~S""" - XDR Source Code:: - - typedef IntUnion IntUnion2; - """ - - -end diff --git a/spec/output/generator_spec_elixir/union.x/int_union2.ex b/spec/output/generator_spec_elixir/union.x/int_union2.ex new file mode 100644 index 000000000..fb2103c3b --- /dev/null +++ b/spec/output/generator_spec_elixir/union.x/int_union2.ex @@ -0,0 +1,49 @@ +defmodule MyXDR.IntUnion2 do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `IntUnion2` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.IntUnion + + @type t :: %__MODULE__{int_union2: IntUnion.t()} + + defstruct [:int_union2] + + @spec new(int_union2 :: IntUnion.t()) :: t() + def new(%IntUnion{} = int_union2), do: %__MODULE__{int_union2: int_union2} + + @impl true + def encode_xdr(%__MODULE__{int_union2: int_union2}) do + IntUnion.encode_xdr(int_union2) + end + + @impl true + def encode_xdr!(%__MODULE__{int_union2: int_union2}) do + IntUnion.encode_xdr!(int_union2) + end + + @impl true + def decode_xdr(bytes, term \\ nil) + + def decode_xdr(bytes, _term) do + case IntUnion.decode_xdr(bytes) do + {:ok, {%IntUnion{} = int_union2, rest}} -> {:ok, {new(int_union2), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, term \\ nil) + + def decode_xdr!(bytes, _term) do + {%IntUnion{} = int_union2, rest} = IntUnion.decode_xdr!(bytes) + {new(int_union2), rest} + end +end diff --git a/spec/output/generator_spec_elixir/union.x/intunion2.ex b/spec/output/generator_spec_elixir/union.x/intunion2.ex deleted file mode 100644 index 7b5533c7b..000000000 --- a/spec/output/generator_spec_elixir/union.x/intunion2.ex +++ /dev/null @@ -1,13 +0,0 @@ -defmodule MyXDR.Intunion2 do - @moduledoc """ - Automatically generated by xdrgen - DO NOT EDIT or your changes may be overwritten - - Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - - Representation of Stellar `Intunion2` type. - """ - - @behaviour XDR.Declaration - -end From 4468a37324bc41cb3cfad1cd70e83f8394da3806 Mon Sep 17 00:00:00 2001 From: Elisabet Salazar <40662951+elisa6@users.noreply.github.com> Date: Fri, 5 May 2023 16:14:57 -0500 Subject: [PATCH 07/13] Add a function to generate a const (#8) * Create hash for constants * Fix generate the list from struct and union * Fix optional types * Fix lists without max length --------- Co-authored-by: jenietoc --- lib/xdrgen/generators/elixir.rb | 88 +++++++++++-------- .../generator_spec_elixir/const.x/foo.ex | 1 - .../const.x/test_array.ex | 2 +- .../const.x/test_array2.ex | 2 +- .../nesting.x/my_union_one.ex | 2 +- .../nesting.x/my_union_two.ex | 2 +- .../optional.x/has_options.ex | 2 +- .../struct.x/my_struct.ex | 2 +- .../generator_spec_elixir/test.x/bar.ex | 1 - .../generator_spec_elixir/test.x/foo.ex | 1 - .../generator_spec_elixir/test.x/has_stuff.ex | 2 +- .../generator_spec_elixir/test.x/hashes3.ex | 8 +- .../test.x/lots_of_my_structs.ex | 2 +- .../generator_spec_elixir/test.x/my_struct.ex | 2 +- .../test.x/my_struct_list.ex | 57 ++++++++++++ .../generator_spec_elixir/test.x/nester.ex | 2 +- .../union.x/multi_list.ex | 57 ++++++++++++ 17 files changed, 180 insertions(+), 53 deletions(-) delete mode 100644 spec/output/generator_spec_elixir/const.x/foo.ex delete mode 100644 spec/output/generator_spec_elixir/test.x/bar.ex delete mode 100644 spec/output/generator_spec_elixir/test.x/foo.ex create mode 100644 spec/output/generator_spec_elixir/test.x/my_struct_list.ex create mode 100644 spec/output/generator_spec_elixir/union.x/multi_list.ex diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index cd1ee97da..fba41980e 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -4,6 +4,7 @@ class Elixir < Xdrgen::Generators::Base MAX_INT = (2**31) - 1 def generate + @constants = Hash.new render_definitions(@top) render_base_classes end @@ -82,10 +83,7 @@ def render_typedef(typedef, is_struct) end def render_const(const) - file_name = "#{const.name.underscore.downcase}.ex" - out = @output.open(file_name) - - out.puts "define_type(\"#{const_name const}\", Const, #{const.value});" + @constants["#{const.name.underscore.downcase}"] = const.value end def render_other_type(type) @@ -94,11 +92,21 @@ def render_other_type(type) unless number.nil? render_typedef(type, true) else - if type.declaration.type.sub_type == :optional + case type.declaration.type.sub_type + when :optional + variable = type.declaration.type + base_type = type_string(variable) + name = type_reference(type, type.name.camelize) + build_optional_typedef(type, base_type, name) + when :var_array, :array variable = type.declaration.type base_type = type_string(variable) name = type_reference(type, type.name.camelize) - build_optional_typedef(type, base_type.downcase, name) + if type.declaration.type.sub_type == :var_array + build_list_typedef(name, base_type, "VariableArray", variable) + else + build_list_typedef(name, base_type, "FixedArray", variable) + end end end rescue => exception @@ -124,7 +132,7 @@ def render_struct(struct) end out.puts alias_list end - out.puts "} \n\n" + out.puts "}\n\n" out.puts "@struct_spec XDR.Struct.new(" out.indent do @@ -351,6 +359,7 @@ def render_union(union) union.arms.each_with_index do |arm, i| arm_name = arm.void? ? "Void" : "#{type_reference arm, arm.name.camelize}" out.puts "#{arm_name}#{comma_unless_last(i, union.arms)}" + render_other_type(arm) end end out.puts "}\n\n" @@ -793,33 +802,33 @@ def build_optional_typedef(typedef, attribute, name) render_define_block(out, "#{name}") do out.indent do - out.puts "alias #{@namespace}.#{attribute.capitalize}\n\n" + out.puts "alias #{@namespace}.#{attribute}\n\n" - out.puts "@optional_spec XDR.Optional.new(#{attribute.capitalize})\n\n" + out.puts "@optional_spec XDR.Optional.new(#{attribute})\n\n" - out.puts "@type #{attribute} :: #{attribute.capitalize}.t() | nil\n\n" + out.puts "@type #{attribute.underscore.downcase} :: #{attribute}.t() | nil\n\n" - out.puts "@type t :: %__MODULE__{#{attribute}: #{attribute}()}\n\n" + out.puts "@type t :: %__MODULE__{#{attribute.underscore.downcase}: #{attribute.underscore.downcase}()}\n\n" - out.puts "defstruct [:#{attribute}]\n\n" + out.puts "defstruct [:#{attribute.underscore.downcase}]\n\n" - out.puts "@spec new(#{attribute} :: #{attribute}()) :: t()\n" - out.puts "def new(#{attribute} \\\\ nil), do: %__MODULE__{#{attribute}: #{attribute}}\n\n" + out.puts "@spec new(#{attribute.underscore.downcase} :: #{attribute.underscore.downcase}()) :: t()\n" + out.puts "def new(#{attribute.underscore.downcase} \\\\ nil), do: %__MODULE__{#{attribute.underscore.downcase}: #{attribute.underscore.downcase}}\n\n" out.puts "@impl true" - out.puts "def encode_xdr(%__MODULE__{#{attribute}: #{attribute}}) do\n" + out.puts "def encode_xdr(%__MODULE__{#{attribute.underscore.downcase}: #{attribute.underscore.downcase}}) do\n" out.indent do - out.puts "#{attribute}" + out.puts "#{attribute.underscore.downcase}" out.puts "|> XDR.Optional.new()" out.puts "|> XDR.Optional.encode_xdr()" end out.puts "end\n\n" out.puts "@impl true" - out.puts "def encode_xdr!(%__MODULE__{#{attribute}: #{attribute}}) do\n" + out.puts "def encode_xdr!(%__MODULE__{#{attribute.underscore.downcase}: #{attribute.underscore.downcase}}) do\n" out.indent do - out.puts "#{attribute}" + out.puts "#{attribute.underscore.downcase}" out.puts "|> XDR.Optional.new()" out.puts "|> XDR.Optional.encode_xdr!()" end @@ -832,7 +841,7 @@ def build_optional_typedef(typedef, attribute, name) out.indent do out.puts "case XDR.Optional.decode_xdr(bytes, optional_spec) do\n" out.indent do - out.puts "{:ok, {%XDR.Optional{type: #{attribute}}, rest}} -> {:ok, {new(#{attribute}), rest}}\n" + out.puts "{:ok, {%XDR.Optional{type: #{attribute.underscore.downcase}}, rest}} -> {:ok, {new(#{attribute.underscore.downcase}), rest}}\n" out.puts "{:ok, {nil, rest}} -> {:ok, {new(), rest}}" out.puts "error -> error\n" end @@ -845,8 +854,8 @@ def build_optional_typedef(typedef, attribute, name) out.puts "def decode_xdr!(bytes, optional_spec) do\n" out.indent do - out.puts "{%XDR.Optional{identifier: #{attribute}}, rest} = XDR.Optional.decode_xdr!(bytes)\n" - out.puts "{new(#{attribute}), rest}\n" + out.puts "{%XDR.Optional{identifier: #{attribute.underscore.downcase}}, rest} = XDR.Optional.decode_xdr!(bytes)\n" + out.puts "{new(#{attribute.underscore.downcase}), rest}\n" out.puts "{nil, rest} -> {new(), rest}" end out.puts "end\n" @@ -978,19 +987,32 @@ def build_opaque_typedef(typedef, type, xdr_module, size = nil, is_struct) end end - def build_list_typedef(typedef, base_type, size, list_type) - file_name = "#{typedef.name.underscore.downcase}.ex" + def build_list_typedef(module_name, base_type, list_type, type) + file_name = "#{module_name.underscore.downcase}.ex" out = @output.open(file_name) - render_define_block(out, typedef.name) do + is_named, size = type.array_size + if type.sub_type == :var_array + size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) + length_nil = type.decl.resolved_size.nil? + else + size = is_named ? @constants["#{size.underscore.downcase}"] : size + length_nil = false + end + + + + render_define_block(out, module_name) do out.indent do out.puts "alias #{@namespace}.#{base_type}\n\n" - out.puts "@#{list_type.downcase == "fixedarray" ? "length" : "max_length"} #{size.nil? ? "4_294_967_295" : size}\n\n" + unless length_nil + out.puts "@#{list_type.downcase == "fixedarray" ? "length" : "max_length"} #{size}\n\n" + end out.puts "@array_type #{base_type}\n\n" - out.puts "@array_spec %{type: @array_type, #{list_type.downcase == "fixedarray" ? "length: @length" : "max_length: @max_length"}}\n\n" + out.puts "@array_spec %{type: @array_type#{length_nil ? "" : ", #{list_type.downcase == "fixedarray"? "length: @length" : "max_length: @max_length"}"}}\n\n" out.puts "@type t :: %__MODULE__{items: list(#{base_type}.t())}\n\n" @@ -1003,7 +1025,7 @@ def build_list_typedef(typedef, base_type, size, list_type) out.puts "def encode_xdr(%__MODULE__{items: items}) do\n" out.indent do out.puts "items\n" - out.puts "|> XDR.#{list_type}.new(@array_type, @#{list_type.downcase == "fixedarray" ? "length" : "max_length"})\n" + out.puts "|> XDR.#{list_type}.new(@array_type#{length_nil ? "" : ", @#{list_type.downcase == "fixedarray" ? "length" : "max_length"}"})\n" out.puts "|> XDR.#{list_type}.encode_xdr()\n" end out.puts "end\n\n" @@ -1012,7 +1034,7 @@ def build_list_typedef(typedef, base_type, size, list_type) out.puts "def encode_xdr!(%__MODULE__{items: items}) do\n" out.indent do out.puts "items\n" - out.puts "|> XDR.#{list_type}.new(@array_type, @#{list_type.downcase == "fixedarray" ? "length" : "max_length"})\n" + out.puts "|> XDR.#{list_type}.new(@array_type#{length_nil ? "" : ", @#{list_type.downcase == "fixedarray" ? "length" : "max_length"}"})\n" out.puts "|> XDR.#{list_type}.encode_xdr!()\n" end out.puts "end\n\n" @@ -1052,15 +1074,11 @@ def build_typedef(typedef, is_struct) case type.sub_type when :optional - build_optional_typedef(typedef, base_type.downcase, name) + build_optional_typedef(typedef, base_type, name) when :array - is_named, size = type.array_size - size = is_named ? "\"#{size}\"" : size - build_list_typedef(typedef, base_type, size, "FixedArray") + build_list_typedef(name, base_type, "FixedArray", type) when :var_array - is_named, size = type.array_size - size = is_named ? "\"#{size}\"" : (size || MAX_INT) - build_list_typedef(typedef, base_type, size, "VariableArray") + build_list_typedef(name, base_type, "VariableArray", type) else case type when AST::Typespecs::Bool diff --git a/spec/output/generator_spec_elixir/const.x/foo.ex b/spec/output/generator_spec_elixir/const.x/foo.ex deleted file mode 100644 index 1685f04ae..000000000 --- a/spec/output/generator_spec_elixir/const.x/foo.ex +++ /dev/null @@ -1 +0,0 @@ -define_type("FOO", Const, 1); diff --git a/spec/output/generator_spec_elixir/const.x/test_array.ex b/spec/output/generator_spec_elixir/const.x/test_array.ex index 6ff5cc768..2c4d35752 100644 --- a/spec/output/generator_spec_elixir/const.x/test_array.ex +++ b/spec/output/generator_spec_elixir/const.x/test_array.ex @@ -12,7 +12,7 @@ defmodule MyXDR.TestArray do alias MyXDR.Int - @length "FOO" + @length 1 @array_type Int diff --git a/spec/output/generator_spec_elixir/const.x/test_array2.ex b/spec/output/generator_spec_elixir/const.x/test_array2.ex index 56e056202..89e49573a 100644 --- a/spec/output/generator_spec_elixir/const.x/test_array2.ex +++ b/spec/output/generator_spec_elixir/const.x/test_array2.ex @@ -12,7 +12,7 @@ defmodule MyXDR.TestArray2 do alias MyXDR.Int - @max_length "FOO" + @max_length 1 @array_type Int diff --git a/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex b/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex index 534961876..6a32d3323 100644 --- a/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex +++ b/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex @@ -12,7 +12,7 @@ defmodule MyXDR.MyUnionOne do alias MyXDR.{ Int - } + } @struct_spec XDR.Struct.new( some_int: Int diff --git a/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex b/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex index 8e368cdcc..1d85ab521 100644 --- a/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex +++ b/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex @@ -13,7 +13,7 @@ defmodule MyXDR.MyUnionTwo do alias MyXDR.{ Int, Foo - } + } @struct_spec XDR.Struct.new( some_int: Int, diff --git a/spec/output/generator_spec_elixir/optional.x/has_options.ex b/spec/output/generator_spec_elixir/optional.x/has_options.ex index 966d48e25..1f840017f 100644 --- a/spec/output/generator_spec_elixir/optional.x/has_options.ex +++ b/spec/output/generator_spec_elixir/optional.x/has_options.ex @@ -13,7 +13,7 @@ defmodule MyXDR.HasOptions do alias MyXDR.{ OptionalInt, OptionalArr - } + } @struct_spec XDR.Struct.new( first_option: OptionalInt, diff --git a/spec/output/generator_spec_elixir/struct.x/my_struct.ex b/spec/output/generator_spec_elixir/struct.x/my_struct.ex index c42c67ed1..4dbd831ee 100644 --- a/spec/output/generator_spec_elixir/struct.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/struct.x/my_struct.ex @@ -16,7 +16,7 @@ defmodule MyXDR.MyStruct do Opaque10, String, String100 - } + } @struct_spec XDR.Struct.new( some_int: Int, diff --git a/spec/output/generator_spec_elixir/test.x/bar.ex b/spec/output/generator_spec_elixir/test.x/bar.ex deleted file mode 100644 index 1a8179d7c..000000000 --- a/spec/output/generator_spec_elixir/test.x/bar.ex +++ /dev/null @@ -1 +0,0 @@ -define_type("BAR", Const, FOO); diff --git a/spec/output/generator_spec_elixir/test.x/foo.ex b/spec/output/generator_spec_elixir/test.x/foo.ex deleted file mode 100644 index 00ac87789..000000000 --- a/spec/output/generator_spec_elixir/test.x/foo.ex +++ /dev/null @@ -1 +0,0 @@ -define_type("FOO", Const, 1244); diff --git a/spec/output/generator_spec_elixir/test.x/has_stuff.ex b/spec/output/generator_spec_elixir/test.x/has_stuff.ex index 03f3f6581..c56e05cb5 100644 --- a/spec/output/generator_spec_elixir/test.x/has_stuff.ex +++ b/spec/output/generator_spec_elixir/test.x/has_stuff.ex @@ -12,7 +12,7 @@ defmodule MyXDR.HasStuff do alias MyXDR.{ LotsOfMyStructs - } + } @struct_spec XDR.Struct.new( data: LotsOfMyStructs diff --git a/spec/output/generator_spec_elixir/test.x/hashes3.ex b/spec/output/generator_spec_elixir/test.x/hashes3.ex index f88f79c04..cdd5d84f3 100644 --- a/spec/output/generator_spec_elixir/test.x/hashes3.ex +++ b/spec/output/generator_spec_elixir/test.x/hashes3.ex @@ -12,11 +12,9 @@ defmodule MyXDR.Hashes3 do alias MyXDR.Hash - @max_length 2147483647 - @array_type Hash - @array_spec %{type: @array_type, max_length: @max_length} + @array_spec %{type: @array_type} @type t :: %__MODULE__{items: list(Hash.t())} @@ -28,14 +26,14 @@ defmodule MyXDR.Hashes3 do @impl true def encode_xdr(%__MODULE__{items: items}) do items - |> XDR.VariableArray.new(@array_type, @max_length) + |> XDR.VariableArray.new(@array_type) |> XDR.VariableArray.encode_xdr() end @impl true def encode_xdr!(%__MODULE__{items: items}) do items - |> XDR.VariableArray.new(@array_type, @max_length) + |> XDR.VariableArray.new(@array_type) |> XDR.VariableArray.encode_xdr!() end diff --git a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex index 2947a5900..9ce65d0fb 100644 --- a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex +++ b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex @@ -12,7 +12,7 @@ defmodule MyXDR.LotsOfMyStructs do alias MyXDR.{ MyStructList - } + } @struct_spec XDR.Struct.new( members: MyStructList diff --git a/spec/output/generator_spec_elixir/test.x/my_struct.ex b/spec/output/generator_spec_elixir/test.x/my_struct.ex index b4a07969f..4e3bbc652 100644 --- a/spec/output/generator_spec_elixir/test.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/test.x/my_struct.ex @@ -18,7 +18,7 @@ defmodule MyXDR.MyStruct do Float, DoubleFloat, Bool - } + } @struct_spec XDR.Struct.new( field1: Uint512, diff --git a/spec/output/generator_spec_elixir/test.x/my_struct_list.ex b/spec/output/generator_spec_elixir/test.x/my_struct_list.ex new file mode 100644 index 000000000..338f57f5a --- /dev/null +++ b/spec/output/generator_spec_elixir/test.x/my_struct_list.ex @@ -0,0 +1,57 @@ +defmodule MyXDR.MyStructList do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `MyStructList` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.MyStruct + + @array_type MyStruct + + @array_spec %{type: @array_type} + + @type t :: %__MODULE__{items: list(MyStruct.t())} + + defstruct [:items] + + @spec new(items :: list(MyStruct.t())) :: t() + def new(items), do: %__MODULE__{items: items} + + @impl true + def encode_xdr(%__MODULE__{items: items}) do + items + |> XDR.VariableArray.new(@array_type) + |> XDR.VariableArray.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{items: items}) do + items + |> XDR.VariableArray.new(@array_type) + |> XDR.VariableArray.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @array_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableArray.decode_xdr(bytes, spec) do + {:ok, {items, rest}} -> {:ok, {new(items), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @array_spec) + + def decode_xdr!(bytes, spec) do + {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {new(items), rest} + end +end diff --git a/spec/output/generator_spec_elixir/test.x/nester.ex b/spec/output/generator_spec_elixir/test.x/nester.ex index f62a243e9..faf108cb4 100644 --- a/spec/output/generator_spec_elixir/test.x/nester.ex +++ b/spec/output/generator_spec_elixir/test.x/nester.ex @@ -14,7 +14,7 @@ defmodule MyXDR.Nester do NesterNestedEnum, NesterNestedStruct, NesterNestedUnion - } + } @struct_spec XDR.Struct.new( nested_enum: NesterNestedEnum, diff --git a/spec/output/generator_spec_elixir/union.x/multi_list.ex b/spec/output/generator_spec_elixir/union.x/multi_list.ex new file mode 100644 index 000000000..2e3136a55 --- /dev/null +++ b/spec/output/generator_spec_elixir/union.x/multi_list.ex @@ -0,0 +1,57 @@ +defmodule MyXDR.MultiList do + @moduledoc """ + Automatically generated by xdrgen + DO NOT EDIT or your changes may be overwritten + + Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr + + Representation of Stellar `MultiList` type. + """ + + @behaviour XDR.Declaration + + alias MyXDR.Multi + + @array_type Multi + + @array_spec %{type: @array_type} + + @type t :: %__MODULE__{items: list(Multi.t())} + + defstruct [:items] + + @spec new(items :: list(Multi.t())) :: t() + def new(items), do: %__MODULE__{items: items} + + @impl true + def encode_xdr(%__MODULE__{items: items}) do + items + |> XDR.VariableArray.new(@array_type) + |> XDR.VariableArray.encode_xdr() + end + + @impl true + def encode_xdr!(%__MODULE__{items: items}) do + items + |> XDR.VariableArray.new(@array_type) + |> XDR.VariableArray.encode_xdr!() + end + + @impl true + def decode_xdr(bytes, spec \\ @array_spec) + + def decode_xdr(bytes, spec) do + case XDR.VariableArray.decode_xdr(bytes, spec) do + {:ok, {items, rest}} -> {:ok, {new(items), rest}} + error -> error + end + end + + @impl true + def decode_xdr!(bytes, spec \\ @array_spec) + + def decode_xdr!(bytes, spec) do + {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {new(items), rest} + end +end From bfe5578b4ff6e4893e6aa3de7bdd0f248108d526 Mon Sep 17 00:00:00 2001 From: Elisabet Salazar <40662951+elisa6@users.noreply.github.com> Date: Tue, 9 May 2023 15:21:10 -0500 Subject: [PATCH 08/13] Fixing issues with XDRgen for Elixir (#9) * Fix module name and remove repeat alias and types * Fix repeat types in the union * Define a map when the arms are integers in unions * Include the Fixed prefix when is a fixed list * Include max length in the module and file name * Fix create a file twice * Fix alias * Fix union type * Change name in uint typedef * Fix number types * Fix order validation --------- Co-authored-by: jenietoc --- lib/xdrgen/generators/elixir.rb | 246 +++++++++++------- .../generator_spec_elixir/test.x/uint512.ex | 4 +- .../generator_spec_elixir/test.x/uint513.ex | 4 +- .../generator_spec_elixir/test.x/uint514.ex | 4 +- .../union.x/int_union.ex | 10 +- 5 files changed, 166 insertions(+), 102 deletions(-) diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index fba41980e..739b8c56a 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -68,9 +68,12 @@ def render_moduledoc(out, type) end def render_define_block(out, module_name) - out.puts "defmodule #{@namespace}.#{module_name.upcase_first} do" + name = module_name.upcase_first + name = module_name.downcase.gsub("uint", "UInt") if module_name.downcase.include?("uint") + + out.puts "defmodule #{@namespace}.#{name} do" out.indent do - render_moduledoc(out, module_name) + render_moduledoc(out, name) end yield ensure @@ -89,24 +92,28 @@ def render_const(const) def render_other_type(type) begin number = type_reference(type, type.name.camelize).scan(/\d+/).first - unless number.nil? - render_typedef(type, true) + case type.declaration.type.sub_type + when :optional + variable = type.declaration.type + base_type = type_string(variable) + name = type_reference(type, type.name.camelize) + build_optional_typedef(type, base_type, name) + when :var_array, :array + variable = type.declaration.type + base_type = type_string(variable) + name = type_reference(type, type.name.camelize) + if type.declaration.type.sub_type == :var_array + is_named, size = type.declaration.type.array_size + size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) + length_nil = type.declaration.type.decl.resolved_size.nil? + name = "#{name}#{size unless length_nil}" + build_list_typedef(name, base_type, "VariableArray", variable) + else + build_list_typedef(name, base_type, "FixedArray", variable) + end else - case type.declaration.type.sub_type - when :optional - variable = type.declaration.type - base_type = type_string(variable) - name = type_reference(type, type.name.camelize) - build_optional_typedef(type, base_type, name) - when :var_array, :array - variable = type.declaration.type - base_type = type_string(variable) - name = type_reference(type, type.name.camelize) - if type.declaration.type.sub_type == :var_array - build_list_typedef(name, base_type, "VariableArray", variable) - else - build_list_typedef(name, base_type, "FixedArray", variable) - end + unless number.nil? + render_typedef(type, true) end end rescue => exception @@ -126,6 +133,12 @@ def render_struct(struct) struct.members.each_with_index do |m, i| name = type_reference m, m.name.camelize unless alias_list.include?(name) + if m.declaration.type.sub_type == :var_array + is_named, size = m.declaration.type.array_size + size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) + length_nil = m.declaration.type.decl.resolved_size.nil? + name = "#{name}#{size unless length_nil}" + end alias_list += "#{name}#{comma_unless_last(i, struct.members)}\n" render_other_type(m) end @@ -137,7 +150,14 @@ def render_struct(struct) out.puts "@struct_spec XDR.Struct.new(" out.indent do struct.members.each_with_index do |m, i| - out.puts "#{m.name.underscore.downcase}: #{type_reference m, m.name.camelize}#{comma_unless_last(i, struct.members)}" + module_name = type_reference m, m.name.camelize + if m.declaration.type.sub_type == :var_array + is_named, size = m.declaration.type.array_size + size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) + length_nil = m.declaration.type.decl.resolved_size.nil? + module_name = "#{module_name}#{size unless length_nil}" + end + out.puts "#{m.name.underscore.downcase}: #{module_name}#{comma_unless_last(i, struct.members)}" end end out.puts ")\n\n" @@ -347,36 +367,56 @@ def render_union(union) union_name = name union union_name_camelize = union.name.camelize union_discriminant = union.discriminant + is_number_type = is_number_type?(union) file_name = "#{union_name.underscore}.ex" out = @output.open(file_name) - render_define_block(out, union_name) do + render_define_block(out, union_name) do out.indent do out.puts "alias #{@namespace}.{\n" out.indent do out.puts "#{type_reference union_discriminant, union_name_camelize}," - union.arms.each_with_index do |arm, i| - arm_name = arm.void? ? "Void" : "#{type_reference arm, arm.name.camelize}" - out.puts "#{arm_name}#{comma_unless_last(i, union.arms)}" - render_other_type(arm) + alias_list = "" + union.arms.each_with_index do |m, i| + name = m.void? ? "Void" : "#{type_reference m, m.name.camelize}" + unless alias_list.include?(name) + unless m.void? + if m.declaration.type.sub_type == :var_array + is_named, size = m.declaration.type.array_size + size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) + length_nil = m.declaration.type.decl.resolved_size.nil? + name = "#{name}#{size unless length_nil}" + end + end + alias_list += "#{name}#{comma_unless_last(i, union.arms)}\n" + render_other_type(m) + end end + out.puts alias_list end out.puts "}\n\n" - out.puts "@arms [" + out.puts "@arms #{is_number_type ? "%{" : "["}" out.indent do union.normal_arms.each_with_index do |arm, i| arm_name = arm.void? ? "Void" : "#{type_reference arm, arm.name.camelize}" - + unless arm.void? + if arm.declaration.type.sub_type == :var_array + is_named, size = arm.declaration.type.array_size + size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) + length_nil = arm.declaration.type.decl.resolved_size.nil? + arm_name = "#{arm_name}#{size unless length_nil}" + end + end arm.cases.each do |acase| switch = if acase.value.is_a?(AST::Identifier) - "#{member_name(acase.value)}" + "#{member_name(acase.value)}:" else - acase.value.text_value + "#{acase.value.text_value} =>" end - out.puts "#{switch}: #{arm_name}#{comma_unless_last(i, union.arms)}" + out.puts "#{switch} #{arm_name}#{comma_unless_last(i, union.arms)}" end end @@ -384,18 +424,30 @@ def render_union(union) out.puts "default: #{type_reference union.default_arm, union.default_arm.name.camelize}" end end - out.puts "]\n\n" + out.puts "#{is_number_type ? "}" : "]"}\n\n" out.puts "@type value ::" out.indent(4) do - union.arms.each_with_index do |arm, i| - arm_name = arm.void? ? "Void" : "#{type_reference arm, arm.name.camelize}" + type_list = "" + union.arms.each_with_index do |m, i| + name = m.void? ? "Void" : "#{type_reference m, m.name.camelize}" + unless m.void? + if m.declaration.type.sub_type == :var_array + is_named, size = m.declaration.type.array_size + size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) + length_nil = m.declaration.type.decl.resolved_size.nil? + name = "#{name}#{size unless length_nil}" + end + end if i == 0 - out.puts "#{arm_name}.t()" + type_list += "#{name}.t()\n" else - out.puts "| #{arm_name}.t()" + unless type_list.include?(name) + type_list += "| #{name}.t()\n" + end end end + out.puts type_list if union.default_arm.present? out.puts "| any()" @@ -456,7 +508,7 @@ def render_union(union) out.puts "@spec union_spec() :: XDR.Union.t()" out.puts "defp union_spec do" out.indent do - out.puts "nil\n" + out.puts "#{is_number_type ? 0 : "nil"}\n" out.puts "|> #{type_reference union_discriminant, union_name_camelize}.new()\n" out.puts "|> XDR.Union.new(@arms)\n" end @@ -475,8 +527,18 @@ def render_base_classes out.close end - def const_name(named) - named.name.underscore.upcase + def is_number_type?(union) + value = false + union.normal_arms.each do |arm| + arm.cases.each do |acase| + value = if acase.value.is_a?(AST::Identifier) + false + else + true + end + end + end + value end def member_name(member) @@ -493,8 +555,10 @@ def type_reference(decl, container_name) case decl.type.sub_type when :optional "Optional#{type_hint}" - when :var_array, :array + when :var_array "#{type_hint}List" + when :array + "#{type_hint}FixedList" else type_hint end @@ -869,67 +933,69 @@ def build_opaque_typedef(typedef, type, xdr_module, size = nil, is_struct) unless size.nil? file_name = "#{type.underscore.downcase}#{size}.ex" - out = @output.open(file_name) - - render_define_block(out, name) do - out.indent do - out.puts "@type t :: %__MODULE__{opaque: binary()}\n\n" - - out.puts "defstruct [:opaque]\n\n" - - out.puts "@#{type.downcase == "opaque" ? "length" : "max_size"} #{size}\n\n" - - out.puts "@opaque_spec XDR.#{xdr_module}.new(nil, @#{type.downcase == "opaque" ? "length" : "max_size"})\n\n" - - out.puts "@spec new(opaque :: binary()) :: t()\n" - out.puts "def new(opaque), do: %__MODULE__{opaque: opaque}\n\n" - - out.puts "@impl true" - out.puts "def encode_xdr(%__MODULE__{opaque: opaque}) do\n" - out.indent do - out.puts "XDR.#{xdr_module}.encode_xdr(%XDR.#{xdr_module}{opaque: opaque, #{type.downcase == "opaque" ? "length: @length" : "max_size: @max_size"}})\n" - end - out.puts "end\n\n" - - out.puts "@impl true" - out.puts "def encode_xdr!(%__MODULE__{opaque: opaque}) do\n" - out.indent do - out.puts "XDR.#{xdr_module}.encode_xdr!(%XDR.#{xdr_module}{opaque: opaque, #{type.downcase == "opaque" ? "length: @length" : "max_size: @max_size"}})\n" - end - out.puts "end\n\n" - - out.puts "@impl true" - out.puts "def decode_xdr(bytes, spec \\\\ @opaque_spec)\n\n" - - out.puts "def decode_xdr(bytes, spec) do\n" + begin + out = @output.open(file_name) + render_define_block(out, name) do out.indent do - out.puts "case XDR.#{xdr_module}.decode_xdr(bytes, spec) do\n" + out.puts "@type t :: %__MODULE__{opaque: binary()}\n\n" + + out.puts "defstruct [:opaque]\n\n" + + out.puts "@#{type.downcase == "opaque" ? "length" : "max_size"} #{size}\n\n" + + out.puts "@opaque_spec XDR.#{xdr_module}.new(nil, @#{type.downcase == "opaque" ? "length" : "max_size"})\n\n" + + out.puts "@spec new(opaque :: binary()) :: t()\n" + out.puts "def new(opaque), do: %__MODULE__{opaque: opaque}\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr(%__MODULE__{opaque: opaque}) do\n" out.indent do - out.puts "{:ok, {%XDR.#{xdr_module}{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}}\n" - out.puts "error -> error\n" + out.puts "XDR.#{xdr_module}.encode_xdr(%XDR.#{xdr_module}{opaque: opaque, #{type.downcase == "opaque" ? "length: @length" : "max_size: @max_size"}})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def encode_xdr!(%__MODULE__{opaque: opaque}) do\n" + out.indent do + out.puts "XDR.#{xdr_module}.encode_xdr!(%XDR.#{xdr_module}{opaque: opaque, #{type.downcase == "opaque" ? "length: @length" : "max_size: @max_size"}})\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr(bytes, spec \\\\ @opaque_spec)\n\n" + + out.puts "def decode_xdr(bytes, spec) do\n" + out.indent do + out.puts "case XDR.#{xdr_module}.decode_xdr(bytes, spec) do\n" + out.indent do + out.puts "{:ok, {%XDR.#{xdr_module}{opaque: opaque}, rest}} -> {:ok, {new(opaque), rest}}\n" + out.puts "error -> error\n" + end + out.puts "end\n" + end + out.puts "end\n\n" + + out.puts "@impl true" + out.puts "def decode_xdr!(bytes, spec \\\\ @opaque_spec)\n\n" + + out.puts "def decode_xdr!(bytes, spec) do\n" + out.indent do + out.puts "{%XDR.#{xdr_module}{opaque: opaque}, rest} = XDR.#{xdr_module}.decode_xdr!(bytes)\n" + out.puts "{new(opaque), rest}\n" end out.puts "end\n" end - out.puts "end\n\n" - - out.puts "@impl true" - out.puts "def decode_xdr!(bytes, spec \\\\ @opaque_spec)\n\n" - - out.puts "def decode_xdr!(bytes, spec) do\n" - out.indent do - out.puts "{%XDR.#{xdr_module}{opaque: opaque}, rest} = XDR.#{xdr_module}.decode_xdr!(bytes)\n" - out.puts "{new(opaque), rest}\n" - end - out.puts "end\n" end + out.close + rescue => exception end - out.close end unless is_struct - file_name_main = "#{typedef.name.downcase.underscore}.ex" + file_name_main = "#{typedef.name.underscore.downcase}.ex" out_main = @output.open(file_name_main) - render_define_block(out_main, typedef.name.downcase) do + render_define_block(out_main, typedef.name) do out_main.indent do out_main.puts "alias #{@namespace}.#{type}#{size}\n\n" @@ -1000,8 +1066,6 @@ def build_list_typedef(module_name, base_type, list_type, type) length_nil = false end - - render_define_block(out, module_name) do out.indent do out.puts "alias #{@namespace}.#{base_type}\n\n" diff --git a/spec/output/generator_spec_elixir/test.x/uint512.ex b/spec/output/generator_spec_elixir/test.x/uint512.ex index 3203ca252..e7c884598 100644 --- a/spec/output/generator_spec_elixir/test.x/uint512.ex +++ b/spec/output/generator_spec_elixir/test.x/uint512.ex @@ -1,11 +1,11 @@ -defmodule MyXDR.Uint512 do +defmodule MyXDR.UInt512 do @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - Representation of Stellar `Uint512` type. + Representation of Stellar `UInt512` type. """ @behaviour XDR.Declaration diff --git a/spec/output/generator_spec_elixir/test.x/uint513.ex b/spec/output/generator_spec_elixir/test.x/uint513.ex index 3d0c9927c..301c6f304 100644 --- a/spec/output/generator_spec_elixir/test.x/uint513.ex +++ b/spec/output/generator_spec_elixir/test.x/uint513.ex @@ -1,11 +1,11 @@ -defmodule MyXDR.Uint513 do +defmodule MyXDR.UInt513 do @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - Representation of Stellar `Uint513` type. + Representation of Stellar `UInt513` type. """ @behaviour XDR.Declaration diff --git a/spec/output/generator_spec_elixir/test.x/uint514.ex b/spec/output/generator_spec_elixir/test.x/uint514.ex index de53cf8e8..f7f5846ef 100644 --- a/spec/output/generator_spec_elixir/test.x/uint514.ex +++ b/spec/output/generator_spec_elixir/test.x/uint514.ex @@ -1,11 +1,11 @@ -defmodule MyXDR.Uint514 do +defmodule MyXDR.UInt514 do @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - Representation of Stellar `Uint514` type. + Representation of Stellar `UInt514` type. """ @behaviour XDR.Declaration diff --git a/spec/output/generator_spec_elixir/union.x/int_union.ex b/spec/output/generator_spec_elixir/union.x/int_union.ex index 0dddec70c..3de287513 100644 --- a/spec/output/generator_spec_elixir/union.x/int_union.ex +++ b/spec/output/generator_spec_elixir/union.x/int_union.ex @@ -16,10 +16,10 @@ defmodule MyXDR.IntUnion do MultiList } - @arms [ - 0: Error, - 1: MultiList - ] + @arms %{ + 0 => Error, + 1 => MultiList + } @type value :: Error.t() @@ -66,7 +66,7 @@ defmodule MyXDR.IntUnion do @spec union_spec() :: XDR.Union.t() defp union_spec do - nil + 0 |> Int.new() |> XDR.Union.new(@arms) end From e351062fde9a13cfd162ba071f68c1aa3df95685 Mon Sep 17 00:00:00 2001 From: Elisabet Salazar <40662951+elisa6@users.noreply.github.com> Date: Thu, 11 May 2023 10:03:49 -0500 Subject: [PATCH 09/13] Fix issues (#10) * Fix opaque type * Fix array type * Fix typo * Send the second arg to opaque types * Remove condition * Add a comma in the separation of arms in unions * Remove unnecessary commas in the alias of unions * Search constant value for opaque types * Change type name in struct types * Fix errors with reserved words in struct types * Fix alias * Refactor code * Fix String types * Fix value name in union types * Fix called function * Modify the params name * Remove validation * Refactor function --------- Co-authored-by: jenietoc --- lib/xdrgen/generators/elixir.rb | 182 +++++++++--------- lib/xdrgen/generators/elixir/base.ex | 42 ++-- .../block_comments.x/base.ex | 42 ++-- .../generator_spec_elixir/const.x/base.ex | 42 ++-- .../const.x/test_array.ex | 2 +- .../const.x/test_array2.ex | 2 +- .../generator_spec_elixir/enum.x/base.ex | 42 ++-- .../generator_spec_elixir/nesting.x/base.ex | 42 ++-- .../nesting.x/my_union_one.ex | 6 +- .../nesting.x/my_union_two.ex | 8 +- .../generator_spec_elixir/optional.x/arr.ex | 2 +- .../generator_spec_elixir/optional.x/base.ex | 42 ++-- .../optional.x/has_options.ex | 10 +- .../optional.x/optional_arr.ex | 8 +- .../optional.x/optional_int.ex | 8 +- .../generator_spec_elixir/struct.x/base.ex | 42 ++-- .../struct.x/my_struct.ex | 14 +- .../struct.x/opaque10.ex | 2 +- .../struct.x/string100.ex | 2 +- .../generator_spec_elixir/test.x/base.ex | 42 ++-- .../generator_spec_elixir/test.x/has_stuff.ex | 6 +- .../generator_spec_elixir/test.x/hash.ex | 10 +- .../generator_spec_elixir/test.x/hashes1.ex | 2 +- .../generator_spec_elixir/test.x/hashes2.ex | 2 +- .../generator_spec_elixir/test.x/hashes3.ex | 2 +- .../test.x/lots_of_my_structs.ex | 6 +- .../generator_spec_elixir/test.x/my_struct.ex | 18 +- .../test.x/my_struct_list.ex | 2 +- .../generator_spec_elixir/test.x/nester.ex | 10 +- .../test.x/nester_nested_struct.ex | 6 +- .../generator_spec_elixir/test.x/opaque32.ex | 2 +- .../generator_spec_elixir/test.x/opaque64.ex | 2 +- .../generator_spec_elixir/test.x/opt_hash1.ex | 8 +- .../generator_spec_elixir/test.x/opt_hash2.ex | 8 +- .../generator_spec_elixir/test.x/str.ex | 2 +- .../generator_spec_elixir/test.x/uint512.ex | 14 +- .../generator_spec_elixir/test.x/uint513.ex | 14 +- .../generator_spec_elixir/test.x/uint514.ex | 14 +- .../test.x/variable_opaque64.ex | 2 +- .../generator_spec_elixir/union.x/base.ex | 42 ++-- .../union.x/multi_list.ex | 2 +- 41 files changed, 384 insertions(+), 372 deletions(-) diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index 739b8c56a..8b6189c42 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -37,21 +37,6 @@ def render_definition(defn) end end - def render_source_comment(out, defn) - return if defn.is_a?(AST::Definitions::Namespace) - - out.puts <<-EOS.strip_heredoc - comment ~S""" - XDR Source Code::\n - EOS - - out.puts " " + defn.text_value.split("\n").join("\n ") - - out.puts <<-EOS.strip_heredoc - """\n - EOS - end - def render_moduledoc(out, type) out.puts <<-EOS.strip_heredoc @moduledoc """ @@ -68,12 +53,9 @@ def render_moduledoc(out, type) end def render_define_block(out, module_name) - name = module_name.upcase_first - name = module_name.downcase.gsub("uint", "UInt") if module_name.downcase.include?("uint") - - out.puts "defmodule #{@namespace}.#{name} do" + out.puts "defmodule #{@namespace}.#{module_name.upcase_first} do" out.indent do - render_moduledoc(out, name) + render_moduledoc(out, module_name) end yield ensure @@ -91,27 +73,30 @@ def render_const(const) def render_other_type(type) begin - number = type_reference(type, type.name.camelize).scan(/\d+/).first - case type.declaration.type.sub_type + type_name_camelize = type.name.camelize + declaration_type = type.declaration.type + sub_type = declaration_type.sub_type + number = type_reference(type, type_name_camelize).scan(/\d+/).first + + case sub_type when :optional - variable = type.declaration.type - base_type = type_string(variable) - name = type_reference(type, type.name.camelize) + base_type = type_string(declaration_type) + name = type_reference(type, type_name_camelize) build_optional_typedef(type, base_type, name) when :var_array, :array - variable = type.declaration.type - base_type = type_string(variable) - name = type_reference(type, type.name.camelize) - if type.declaration.type.sub_type == :var_array - is_named, size = type.declaration.type.array_size - size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) - length_nil = type.declaration.type.decl.resolved_size.nil? + base_type = type_string(declaration_type) + name = type_reference(type, type_name_camelize) + if sub_type == :var_array + is_named, size = declaration_type.array_size + size = get_size(size, is_named, true) + length_nil = declaration_type.decl.resolved_size.nil? name = "#{name}#{size unless length_nil}" - build_list_typedef(name, base_type, "VariableArray", variable) + build_list_typedef(name, base_type, "VariableArray", declaration_type) else - build_list_typedef(name, base_type, "FixedArray", variable) + build_list_typedef(name, base_type, "FixedArray", declaration_type) end else + unless number.nil? render_typedef(type, true) end @@ -129,21 +114,21 @@ def render_struct(struct) out.indent do out.puts "alias #{@namespace}.{\n" out.indent do - alias_list = "" - struct.members.each_with_index do |m, i| + alias_list = [] + struct.members.each do |m| name = type_reference m, m.name.camelize unless alias_list.include?(name) if m.declaration.type.sub_type == :var_array - is_named, size = m.declaration.type.array_size - size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) - length_nil = m.declaration.type.decl.resolved_size.nil? - name = "#{name}#{size unless length_nil}" + name = add_size_to_name(m, name) end - alias_list += "#{name}#{comma_unless_last(i, struct.members)}\n" + alias_list << name render_other_type(m) end end - out.puts alias_list + + alias_list.each_with_index do |m, i| + out.puts "#{m}#{comma_unless_last(i, alias_list)}" + end end out.puts "}\n\n" @@ -152,10 +137,7 @@ def render_struct(struct) struct.members.each_with_index do |m, i| module_name = type_reference m, m.name.camelize if m.declaration.type.sub_type == :var_array - is_named, size = m.declaration.type.array_size - size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) - length_nil = m.declaration.type.decl.resolved_size.nil? - module_name = "#{module_name}#{size unless length_nil}" + module_name = add_size_to_name(m, module_name) end out.puts "#{m.name.underscore.downcase}: #{module_name}#{comma_unless_last(i, struct.members)}" end @@ -163,13 +145,17 @@ def render_struct(struct) out.puts ")\n\n" struct.members.each_with_index do |m, i| - out.puts "@type #{m.name.underscore.downcase} :: #{type_reference m, m.name.camelize}.t()" + module_name = type_reference m, m.name.camelize + if m.declaration.type.sub_type == :var_array + module_name = add_size_to_name(m, module_name) + end + out.puts "@type type_#{m.name.underscore.downcase} :: #{module_name}.t()" end out.puts "\n" types = "@type t :: %__MODULE__{" struct.members.each_with_index do |m, i| - types += "#{m.name.underscore.downcase}: #{m.name.underscore.downcase}()#{comma_and_space_unless_last(i, struct.members)}" + types += "#{m.name.underscore.downcase}: type_#{m.name.underscore.downcase}()#{comma_and_space_unless_last(i, struct.members)}" end types += "}\n\n" out.puts types @@ -183,7 +169,7 @@ def render_struct(struct) spec = "@spec new(" struct.members.each_with_index do |m, i| - spec += "#{m.name.underscore.downcase} :: #{m.name.underscore.downcase}()#{comma_and_space_unless_last(i, struct.members)}" + spec += "#{m.name.underscore.downcase} :: type_#{m.name.underscore.downcase}()#{comma_and_space_unless_last(i, struct.members)}" end spec += ") :: t()\n" out.puts spec @@ -191,7 +177,11 @@ def render_struct(struct) out.puts "def new(" out.indent do struct.members.each_with_index do |m, i| - out.puts "%#{type_reference m, m.name.camelize}{} = #{m.name.underscore.downcase}#{comma_unless_last(i, struct.members)}" + module_name = type_reference m, m.name.camelize + if m.declaration.type.sub_type == :var_array + module_name = add_size_to_name(m, module_name) + end + out.puts "%#{module_name}{} = #{m.name.underscore.downcase}#{comma_unless_last(i, struct.members)}" end end out.puts "),\n" @@ -377,23 +367,23 @@ def render_union(union) out.puts "alias #{@namespace}.{\n" out.indent do out.puts "#{type_reference union_discriminant, union_name_camelize}," - alias_list = "" - union.arms.each_with_index do |m, i| + alias_list = [] + union.arms.each do |m| name = m.void? ? "Void" : "#{type_reference m, m.name.camelize}" unless alias_list.include?(name) unless m.void? if m.declaration.type.sub_type == :var_array - is_named, size = m.declaration.type.array_size - size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) - length_nil = m.declaration.type.decl.resolved_size.nil? - name = "#{name}#{size unless length_nil}" + name = add_size_to_name(m, name) end end - alias_list += "#{name}#{comma_unless_last(i, union.arms)}\n" + alias_list << name render_other_type(m) end end - out.puts alias_list + + alias_list.each_with_index do |m, i| + out.puts "#{m}#{comma_unless_last(i, alias_list)}" + end end out.puts "}\n\n" @@ -403,20 +393,16 @@ def render_union(union) arm_name = arm.void? ? "Void" : "#{type_reference arm, arm.name.camelize}" unless arm.void? if arm.declaration.type.sub_type == :var_array - is_named, size = arm.declaration.type.array_size - size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) - length_nil = arm.declaration.type.decl.resolved_size.nil? - arm_name = "#{arm_name}#{size unless length_nil}" + arm_name = add_size_to_name(m, arm_name) end end - arm.cases.each do |acase| + arm.cases.each_with_index do |acase, o| switch = if acase.value.is_a?(AST::Identifier) "#{member_name(acase.value)}:" else "#{acase.value.text_value} =>" end - - out.puts "#{switch} #{arm_name}#{comma_unless_last(i, union.arms)}" + out.puts "#{switch} #{arm_name}#{(union.arms.count <= (i + 1)) && ((o + 1) >= arm.cases.count) ? "" : ","}" end end @@ -433,10 +419,7 @@ def render_union(union) name = m.void? ? "Void" : "#{type_reference m, m.name.camelize}" unless m.void? if m.declaration.type.sub_type == :var_array - is_named, size = m.declaration.type.array_size - size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) - length_nil = m.declaration.type.decl.resolved_size.nil? - name = "#{name}#{size unless length_nil}" + name = add_size_to_name(m, name) end end if i == 0 @@ -518,6 +501,23 @@ def render_union(union) end private + def add_size_to_name(member, name) + is_named, size = member.declaration.type.array_size + size = get_size(size, is_named, true) + length_nil = member.declaration.type.decl.resolved_size.nil? + "#{name}#{size unless length_nil}" + end + + def get_size(size, is_named = false, is_var_array_type = false) + if size + if is_var_array_type + is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) + else + size.scan(/\D/).any? ? @constants["#{size.underscore.downcase}"] : size + end + end + end + def render_base_classes file_name = "base.ex" out = @output.open(file_name) @@ -600,14 +600,14 @@ def type_string(type) "Int" when AST::Typespecs::Opaque if type.fixed? - "Opaque#{type.size}" + "Opaque#{get_size(type.size)}" else - type.size ? "VariableOpaque#{type.size}" : "VariableOpaque" + type.size ? "VariableOpaque#{get_size(type.size)}" : "VariableOpaque" end when AST::Typespecs::Quadruple raise "no quadruple support in elixir" when AST::Typespecs::String - "String#{type.size}" + "String#{get_size(type.size)}" when AST::Typespecs::UnsignedHyper "HyperUInt" when AST::Typespecs::UnsignedInt @@ -790,17 +790,17 @@ def build_bool_typedef(typedef, number_type, type, attribute) def build_string_typedef(typedef, is_struct) name = is_struct ? type_string(typedef.declaration.type) : typedef.name - file_name = "#{name.downcase.underscore}.ex" + file_name = "#{name.underscore.downcase}.ex" out = @output.open(file_name) - render_define_block(out, name.downcase) do + render_define_block(out, name) do out.indent do out.puts "@type t :: %__MODULE__{value: String.t()}\n\n" out.puts "defstruct [:value]\n\n" unless typedef.declaration.type.size.nil? - out.puts "@max_lenght #{typedef.declaration.type.size}\n\n" + out.puts "@max_length #{get_size(typedef.declaration.type.size)}\n\n" end out.puts "@spec new(value :: String.t()) :: t()\n" @@ -918,17 +918,21 @@ def build_optional_typedef(typedef, attribute, name) out.puts "def decode_xdr!(bytes, optional_spec) do\n" out.indent do - out.puts "{%XDR.Optional{identifier: #{attribute.underscore.downcase}}, rest} = XDR.Optional.decode_xdr!(bytes)\n" - out.puts "{new(#{attribute.underscore.downcase}), rest}\n" - out.puts "{nil, rest} -> {new(), rest}" - end - out.puts "end\n" + out.puts "case XDR.Optional.decode_xdr!(bytes, optional_spec) do\n" + out.indent do + out.puts "{%XDR.Optional{type: #{attribute.underscore.downcase}}, rest} -> {new(#{attribute.underscore.downcase}), rest}\n" + out.puts "{nil, rest} -> {new(), rest}" + end + out.puts "end\n" + end + out.puts "end\n\n" end end out.close end def build_opaque_typedef(typedef, type, xdr_module, size = nil, is_struct) + size = get_size(size) unless size.nil? name = "#{type}#{size}" unless size.nil? @@ -981,7 +985,7 @@ def build_opaque_typedef(typedef, type, xdr_module, size = nil, is_struct) out.puts "def decode_xdr!(bytes, spec) do\n" out.indent do - out.puts "{%XDR.#{xdr_module}{opaque: opaque}, rest} = XDR.#{xdr_module}.decode_xdr!(bytes)\n" + out.puts "{%XDR.#{xdr_module}{opaque: opaque}, rest} = XDR.#{xdr_module}.decode_xdr!(bytes, spec)\n" out.puts "{new(opaque), rest}\n" end out.puts "end\n" @@ -1016,11 +1020,11 @@ def build_opaque_typedef(typedef, type, xdr_module, size = nil, is_struct) out_main.puts "end\n\n" out_main.puts "@impl true" - out_main.puts "def encode_xdr!(%__MODULE__{opaque: opaque}) do\n" + out_main.puts "def encode_xdr!(%__MODULE__{value: value}) do\n" out_main.indent do out_main.puts "value\n" out_main.puts "|> #{type}#{size}.new()\n" - out_main.puts "|> #{type}#{size}.encode_xdr()\n" + out_main.puts "|> #{type}#{size}.encode_xdr!()\n" end out_main.puts "end\n\n" @@ -1029,9 +1033,9 @@ def build_opaque_typedef(typedef, type, xdr_module, size = nil, is_struct) out_main.puts "def decode_xdr(bytes, _term) do\n" out_main.indent do - out_main.puts "case XDR.#{type}#{size}.decode_xdr(bytes, term) do\n" + out_main.puts "case #{type}#{size}.decode_xdr(bytes) do\n" out_main.indent do - out_main.puts "{:ok, {%XDR.#{type}#{size}{opaque: value}, rest}} -> {:ok, {new(value), rest}}\n" + out_main.puts "{:ok, {%#{type}#{size}{opaque: value}, rest}} -> {:ok, {new(value), rest}}\n" out_main.puts "error -> error\n" end out_main.puts "end\n" @@ -1043,7 +1047,7 @@ def build_opaque_typedef(typedef, type, xdr_module, size = nil, is_struct) out_main.puts "def decode_xdr!(bytes, _term) do\n" out_main.indent do - out_main.puts "{%XDR.#{type}#{size}{opaque: value}, rest} = XDR.#{type}#{size}.decode_xdr!(bytes)\n" + out_main.puts "{%#{type}#{size}{opaque: value}, rest} = #{type}#{size}.decode_xdr!(bytes)\n" out_main.puts "{new(value), rest}\n" end out_main.puts "end\n" @@ -1059,10 +1063,10 @@ def build_list_typedef(module_name, base_type, list_type, type) is_named, size = type.array_size if type.sub_type == :var_array - size = is_named ? @constants["#{size.underscore.downcase}"] : (size || MAX_INT) + size = get_size(size, is_named, true) length_nil = type.decl.resolved_size.nil? else - size = is_named ? @constants["#{size.underscore.downcase}"] : size + size = get_size(size, is_named) length_nil = false end @@ -1122,7 +1126,7 @@ def build_list_typedef(module_name, base_type, list_type, type) out.puts "def decode_xdr!(bytes, spec) do\n" out.indent do - out.puts "{items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec)\n" + out.puts "{items, rest} = XDR.#{list_type}.decode_xdr!(bytes, spec)\n" out.puts "{new(items), rest}\n" end out.puts "end\n" diff --git a/lib/xdrgen/generators/elixir/base.ex b/lib/xdrgen/generators/elixir/base.ex index 47b124b7b..a2a8cdc5a 100644 --- a/lib/xdrgen/generators/elixir/base.ex +++ b/lib/xdrgen/generators/elixir/base.ex @@ -41,9 +41,9 @@ defmodule Int do end end -defmodule UInt do +defmodule Uint do @moduledoc """ - Representation of Stellar `UInt` type. + Representation of Stellar `Uint` type. """ @behaviour XDR.Declaration @@ -91,21 +91,21 @@ defmodule Float do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr(%XDR.Float{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.Float.encode_xdr(%XDR.Float{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.Float.encode_xdr!(%XDR.Float{float: float}) end @impl true @@ -113,7 +113,7 @@ defmodule Float do def decode_xdr(bytes, _term) do case XDR.Float.decode_xdr(bytes) do - {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.Float{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -122,7 +122,7 @@ defmodule Float do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {%XDR.Float{float: float}, rest} = XDR.Float.decode_xdr!(bytes) {new(float), rest} end end @@ -134,21 +134,21 @@ defmodule DoubleFloat do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{float: float}) end @impl true @@ -156,7 +156,7 @@ defmodule DoubleFloat do def decode_xdr(bytes, _term) do case XDR.DoubleFloat.decode_xdr(bytes) do - {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.DoubleFloat{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -165,7 +165,7 @@ defmodule DoubleFloat do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {%XDR.DoubleFloat{float: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) {new(float), rest} end end @@ -314,7 +314,7 @@ defmodule FixedOpaque do defstruct [:opaque] - @length = 4_294_967_295 + @length 4_294_967_295 @opaque_spec XDR.FixedOpaque.new(nil, @length) diff --git a/spec/output/generator_spec_elixir/block_comments.x/base.ex b/spec/output/generator_spec_elixir/block_comments.x/base.ex index d54324fd3..3164dc83e 100644 --- a/spec/output/generator_spec_elixir/block_comments.x/base.ex +++ b/spec/output/generator_spec_elixir/block_comments.x/base.ex @@ -41,9 +41,9 @@ defmodule MyXDR.Int do end end -defmodule MyXDR.UInt do +defmodule MyXDR.Uint do @moduledoc """ - Representation of Stellar `UInt` type. + Representation of Stellar `Uint` type. """ @behaviour XDR.Declaration @@ -91,21 +91,21 @@ defmodule MyXDR.Float do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr(%XDR.Float{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.Float.encode_xdr(%XDR.Float{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.Float.encode_xdr!(%XDR.Float{float: float}) end @impl true @@ -113,7 +113,7 @@ defmodule MyXDR.Float do def decode_xdr(bytes, _term) do case XDR.Float.decode_xdr(bytes) do - {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.Float{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -122,7 +122,7 @@ defmodule MyXDR.Float do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {%XDR.Float{float: float}, rest} = XDR.Float.decode_xdr!(bytes) {new(float), rest} end end @@ -134,21 +134,21 @@ defmodule MyXDR.DoubleFloat do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{float: float}) end @impl true @@ -156,7 +156,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr(bytes, _term) do case XDR.DoubleFloat.decode_xdr(bytes) do - {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.DoubleFloat{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -165,7 +165,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {%XDR.DoubleFloat{float: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) {new(float), rest} end end @@ -314,7 +314,7 @@ defmodule MyXDR.FixedOpaque do defstruct [:opaque] - @length = 4_294_967_295 + @length 4_294_967_295 @opaque_spec XDR.FixedOpaque.new(nil, @length) diff --git a/spec/output/generator_spec_elixir/const.x/base.ex b/spec/output/generator_spec_elixir/const.x/base.ex index d54324fd3..3164dc83e 100644 --- a/spec/output/generator_spec_elixir/const.x/base.ex +++ b/spec/output/generator_spec_elixir/const.x/base.ex @@ -41,9 +41,9 @@ defmodule MyXDR.Int do end end -defmodule MyXDR.UInt do +defmodule MyXDR.Uint do @moduledoc """ - Representation of Stellar `UInt` type. + Representation of Stellar `Uint` type. """ @behaviour XDR.Declaration @@ -91,21 +91,21 @@ defmodule MyXDR.Float do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr(%XDR.Float{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.Float.encode_xdr(%XDR.Float{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.Float.encode_xdr!(%XDR.Float{float: float}) end @impl true @@ -113,7 +113,7 @@ defmodule MyXDR.Float do def decode_xdr(bytes, _term) do case XDR.Float.decode_xdr(bytes) do - {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.Float{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -122,7 +122,7 @@ defmodule MyXDR.Float do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {%XDR.Float{float: float}, rest} = XDR.Float.decode_xdr!(bytes) {new(float), rest} end end @@ -134,21 +134,21 @@ defmodule MyXDR.DoubleFloat do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{float: float}) end @impl true @@ -156,7 +156,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr(bytes, _term) do case XDR.DoubleFloat.decode_xdr(bytes) do - {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.DoubleFloat{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -165,7 +165,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {%XDR.DoubleFloat{float: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) {new(float), rest} end end @@ -314,7 +314,7 @@ defmodule MyXDR.FixedOpaque do defstruct [:opaque] - @length = 4_294_967_295 + @length 4_294_967_295 @opaque_spec XDR.FixedOpaque.new(nil, @length) diff --git a/spec/output/generator_spec_elixir/const.x/test_array.ex b/spec/output/generator_spec_elixir/const.x/test_array.ex index 2c4d35752..432037bf3 100644 --- a/spec/output/generator_spec_elixir/const.x/test_array.ex +++ b/spec/output/generator_spec_elixir/const.x/test_array.ex @@ -53,7 +53,7 @@ defmodule MyXDR.TestArray do def decode_xdr!(bytes, spec \\ @array_spec) def decode_xdr!(bytes, spec) do - {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {items, rest} = XDR.FixedArray.decode_xdr!(bytes, spec) {new(items), rest} end end diff --git a/spec/output/generator_spec_elixir/const.x/test_array2.ex b/spec/output/generator_spec_elixir/const.x/test_array2.ex index 89e49573a..350d7c193 100644 --- a/spec/output/generator_spec_elixir/const.x/test_array2.ex +++ b/spec/output/generator_spec_elixir/const.x/test_array2.ex @@ -53,7 +53,7 @@ defmodule MyXDR.TestArray2 do def decode_xdr!(bytes, spec \\ @array_spec) def decode_xdr!(bytes, spec) do - {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {items, rest} = XDR.VariableArray.decode_xdr!(bytes, spec) {new(items), rest} end end diff --git a/spec/output/generator_spec_elixir/enum.x/base.ex b/spec/output/generator_spec_elixir/enum.x/base.ex index d54324fd3..3164dc83e 100644 --- a/spec/output/generator_spec_elixir/enum.x/base.ex +++ b/spec/output/generator_spec_elixir/enum.x/base.ex @@ -41,9 +41,9 @@ defmodule MyXDR.Int do end end -defmodule MyXDR.UInt do +defmodule MyXDR.Uint do @moduledoc """ - Representation of Stellar `UInt` type. + Representation of Stellar `Uint` type. """ @behaviour XDR.Declaration @@ -91,21 +91,21 @@ defmodule MyXDR.Float do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr(%XDR.Float{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.Float.encode_xdr(%XDR.Float{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.Float.encode_xdr!(%XDR.Float{float: float}) end @impl true @@ -113,7 +113,7 @@ defmodule MyXDR.Float do def decode_xdr(bytes, _term) do case XDR.Float.decode_xdr(bytes) do - {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.Float{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -122,7 +122,7 @@ defmodule MyXDR.Float do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {%XDR.Float{float: float}, rest} = XDR.Float.decode_xdr!(bytes) {new(float), rest} end end @@ -134,21 +134,21 @@ defmodule MyXDR.DoubleFloat do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{float: float}) end @impl true @@ -156,7 +156,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr(bytes, _term) do case XDR.DoubleFloat.decode_xdr(bytes) do - {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.DoubleFloat{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -165,7 +165,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {%XDR.DoubleFloat{float: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) {new(float), rest} end end @@ -314,7 +314,7 @@ defmodule MyXDR.FixedOpaque do defstruct [:opaque] - @length = 4_294_967_295 + @length 4_294_967_295 @opaque_spec XDR.FixedOpaque.new(nil, @length) diff --git a/spec/output/generator_spec_elixir/nesting.x/base.ex b/spec/output/generator_spec_elixir/nesting.x/base.ex index d54324fd3..3164dc83e 100644 --- a/spec/output/generator_spec_elixir/nesting.x/base.ex +++ b/spec/output/generator_spec_elixir/nesting.x/base.ex @@ -41,9 +41,9 @@ defmodule MyXDR.Int do end end -defmodule MyXDR.UInt do +defmodule MyXDR.Uint do @moduledoc """ - Representation of Stellar `UInt` type. + Representation of Stellar `Uint` type. """ @behaviour XDR.Declaration @@ -91,21 +91,21 @@ defmodule MyXDR.Float do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr(%XDR.Float{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.Float.encode_xdr(%XDR.Float{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.Float.encode_xdr!(%XDR.Float{float: float}) end @impl true @@ -113,7 +113,7 @@ defmodule MyXDR.Float do def decode_xdr(bytes, _term) do case XDR.Float.decode_xdr(bytes) do - {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.Float{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -122,7 +122,7 @@ defmodule MyXDR.Float do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {%XDR.Float{float: float}, rest} = XDR.Float.decode_xdr!(bytes) {new(float), rest} end end @@ -134,21 +134,21 @@ defmodule MyXDR.DoubleFloat do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{float: float}) end @impl true @@ -156,7 +156,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr(bytes, _term) do case XDR.DoubleFloat.decode_xdr(bytes) do - {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.DoubleFloat{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -165,7 +165,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {%XDR.DoubleFloat{float: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) {new(float), rest} end end @@ -314,7 +314,7 @@ defmodule MyXDR.FixedOpaque do defstruct [:opaque] - @length = 4_294_967_295 + @length 4_294_967_295 @opaque_spec XDR.FixedOpaque.new(nil, @length) diff --git a/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex b/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex index 6a32d3323..9434d3ca8 100644 --- a/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex +++ b/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex @@ -18,13 +18,13 @@ defmodule MyXDR.MyUnionOne do some_int: Int ) - @type some_int :: Int.t() + @type type_some_int :: Int.t() - @type t :: %__MODULE__{some_int: some_int()} + @type t :: %__MODULE__{some_int: type_some_int()} defstruct [:some_int] - @spec new(some_int :: some_int()) :: t() + @spec new(some_int :: type_some_int()) :: t() def new( %Int{} = some_int ), diff --git a/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex b/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex index 1d85ab521..30cd879e9 100644 --- a/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex +++ b/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex @@ -20,14 +20,14 @@ defmodule MyXDR.MyUnionTwo do foo: Foo ) - @type some_int :: Int.t() - @type foo :: Foo.t() + @type type_some_int :: Int.t() + @type type_foo :: Foo.t() - @type t :: %__MODULE__{some_int: some_int(), foo: foo()} + @type t :: %__MODULE__{some_int: type_some_int(), foo: type_foo()} defstruct [:some_int, :foo] - @spec new(some_int :: some_int(), foo :: foo()) :: t() + @spec new(some_int :: type_some_int(), foo :: type_foo()) :: t() def new( %Int{} = some_int, %Foo{} = foo diff --git a/spec/output/generator_spec_elixir/optional.x/arr.ex b/spec/output/generator_spec_elixir/optional.x/arr.ex index 78949374d..74aad724c 100644 --- a/spec/output/generator_spec_elixir/optional.x/arr.ex +++ b/spec/output/generator_spec_elixir/optional.x/arr.ex @@ -53,7 +53,7 @@ defmodule MyXDR.Arr do def decode_xdr!(bytes, spec \\ @array_spec) def decode_xdr!(bytes, spec) do - {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {items, rest} = XDR.FixedArray.decode_xdr!(bytes, spec) {new(items), rest} end end diff --git a/spec/output/generator_spec_elixir/optional.x/base.ex b/spec/output/generator_spec_elixir/optional.x/base.ex index d54324fd3..3164dc83e 100644 --- a/spec/output/generator_spec_elixir/optional.x/base.ex +++ b/spec/output/generator_spec_elixir/optional.x/base.ex @@ -41,9 +41,9 @@ defmodule MyXDR.Int do end end -defmodule MyXDR.UInt do +defmodule MyXDR.Uint do @moduledoc """ - Representation of Stellar `UInt` type. + Representation of Stellar `Uint` type. """ @behaviour XDR.Declaration @@ -91,21 +91,21 @@ defmodule MyXDR.Float do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr(%XDR.Float{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.Float.encode_xdr(%XDR.Float{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.Float.encode_xdr!(%XDR.Float{float: float}) end @impl true @@ -113,7 +113,7 @@ defmodule MyXDR.Float do def decode_xdr(bytes, _term) do case XDR.Float.decode_xdr(bytes) do - {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.Float{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -122,7 +122,7 @@ defmodule MyXDR.Float do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {%XDR.Float{float: float}, rest} = XDR.Float.decode_xdr!(bytes) {new(float), rest} end end @@ -134,21 +134,21 @@ defmodule MyXDR.DoubleFloat do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{float: float}) end @impl true @@ -156,7 +156,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr(bytes, _term) do case XDR.DoubleFloat.decode_xdr(bytes) do - {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.DoubleFloat{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -165,7 +165,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {%XDR.DoubleFloat{float: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) {new(float), rest} end end @@ -314,7 +314,7 @@ defmodule MyXDR.FixedOpaque do defstruct [:opaque] - @length = 4_294_967_295 + @length 4_294_967_295 @opaque_spec XDR.FixedOpaque.new(nil, @length) diff --git a/spec/output/generator_spec_elixir/optional.x/has_options.ex b/spec/output/generator_spec_elixir/optional.x/has_options.ex index 1f840017f..df7976e6a 100644 --- a/spec/output/generator_spec_elixir/optional.x/has_options.ex +++ b/spec/output/generator_spec_elixir/optional.x/has_options.ex @@ -21,15 +21,15 @@ defmodule MyXDR.HasOptions do third_option: OptionalArr ) - @type first_option :: OptionalInt.t() - @type second_option :: OptionalInt.t() - @type third_option :: OptionalArr.t() + @type type_first_option :: OptionalInt.t() + @type type_second_option :: OptionalInt.t() + @type type_third_option :: OptionalArr.t() - @type t :: %__MODULE__{first_option: first_option(), second_option: second_option(), third_option: third_option()} + @type t :: %__MODULE__{first_option: type_first_option(), second_option: type_second_option(), third_option: type_third_option()} defstruct [:first_option, :second_option, :third_option] - @spec new(first_option :: first_option(), second_option :: second_option(), third_option :: third_option()) :: t() + @spec new(first_option :: type_first_option(), second_option :: type_second_option(), third_option :: type_third_option()) :: t() def new( %OptionalInt{} = first_option, %OptionalInt{} = second_option, diff --git a/spec/output/generator_spec_elixir/optional.x/optional_arr.ex b/spec/output/generator_spec_elixir/optional.x/optional_arr.ex index 156ee44ff..a99a0c7fc 100644 --- a/spec/output/generator_spec_elixir/optional.x/optional_arr.ex +++ b/spec/output/generator_spec_elixir/optional.x/optional_arr.ex @@ -52,8 +52,10 @@ defmodule MyXDR.OptionalArr do def decode_xdr!(bytes, optional_spec \\ @optional_spec) def decode_xdr!(bytes, optional_spec) do - {%XDR.Optional{identifier: arr}, rest} = XDR.Optional.decode_xdr!(bytes) - {new(arr), rest} - {nil, rest} -> {new(), rest} + case XDR.Optional.decode_xdr!(bytes, optional_spec) do + {%XDR.Optional{type: arr}, rest} -> {new(arr), rest} + {nil, rest} -> {new(), rest} + end end + end diff --git a/spec/output/generator_spec_elixir/optional.x/optional_int.ex b/spec/output/generator_spec_elixir/optional.x/optional_int.ex index df6218096..684121db9 100644 --- a/spec/output/generator_spec_elixir/optional.x/optional_int.ex +++ b/spec/output/generator_spec_elixir/optional.x/optional_int.ex @@ -52,8 +52,10 @@ defmodule MyXDR.OptionalInt do def decode_xdr!(bytes, optional_spec \\ @optional_spec) def decode_xdr!(bytes, optional_spec) do - {%XDR.Optional{identifier: int}, rest} = XDR.Optional.decode_xdr!(bytes) - {new(int), rest} - {nil, rest} -> {new(), rest} + case XDR.Optional.decode_xdr!(bytes, optional_spec) do + {%XDR.Optional{type: int}, rest} -> {new(int), rest} + {nil, rest} -> {new(), rest} + end end + end diff --git a/spec/output/generator_spec_elixir/struct.x/base.ex b/spec/output/generator_spec_elixir/struct.x/base.ex index d54324fd3..3164dc83e 100644 --- a/spec/output/generator_spec_elixir/struct.x/base.ex +++ b/spec/output/generator_spec_elixir/struct.x/base.ex @@ -41,9 +41,9 @@ defmodule MyXDR.Int do end end -defmodule MyXDR.UInt do +defmodule MyXDR.Uint do @moduledoc """ - Representation of Stellar `UInt` type. + Representation of Stellar `Uint` type. """ @behaviour XDR.Declaration @@ -91,21 +91,21 @@ defmodule MyXDR.Float do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr(%XDR.Float{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.Float.encode_xdr(%XDR.Float{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.Float.encode_xdr!(%XDR.Float{float: float}) end @impl true @@ -113,7 +113,7 @@ defmodule MyXDR.Float do def decode_xdr(bytes, _term) do case XDR.Float.decode_xdr(bytes) do - {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.Float{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -122,7 +122,7 @@ defmodule MyXDR.Float do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {%XDR.Float{float: float}, rest} = XDR.Float.decode_xdr!(bytes) {new(float), rest} end end @@ -134,21 +134,21 @@ defmodule MyXDR.DoubleFloat do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{float: float}) end @impl true @@ -156,7 +156,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr(bytes, _term) do case XDR.DoubleFloat.decode_xdr(bytes) do - {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.DoubleFloat{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -165,7 +165,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {%XDR.DoubleFloat{float: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) {new(float), rest} end end @@ -314,7 +314,7 @@ defmodule MyXDR.FixedOpaque do defstruct [:opaque] - @length = 4_294_967_295 + @length 4_294_967_295 @opaque_spec XDR.FixedOpaque.new(nil, @length) diff --git a/spec/output/generator_spec_elixir/struct.x/my_struct.ex b/spec/output/generator_spec_elixir/struct.x/my_struct.ex index 4dbd831ee..04e2b7299 100644 --- a/spec/output/generator_spec_elixir/struct.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/struct.x/my_struct.ex @@ -26,17 +26,17 @@ defmodule MyXDR.MyStruct do max_string: String100 ) - @type some_int :: Int.t() - @type a_big_int :: Int64.t() - @type some_opaque :: Opaque10.t() - @type some_string :: String.t() - @type max_string :: String100.t() + @type type_some_int :: Int.t() + @type type_a_big_int :: Int64.t() + @type type_some_opaque :: Opaque10.t() + @type type_some_string :: String.t() + @type type_max_string :: String100.t() - @type t :: %__MODULE__{some_int: some_int(), a_big_int: a_big_int(), some_opaque: some_opaque(), some_string: some_string(), max_string: max_string()} + @type t :: %__MODULE__{some_int: type_some_int(), a_big_int: type_a_big_int(), some_opaque: type_some_opaque(), some_string: type_some_string(), max_string: type_max_string()} defstruct [:some_int, :a_big_int, :some_opaque, :some_string, :max_string] - @spec new(some_int :: some_int(), a_big_int :: a_big_int(), some_opaque :: some_opaque(), some_string :: some_string(), max_string :: max_string()) :: t() + @spec new(some_int :: type_some_int(), a_big_int :: type_a_big_int(), some_opaque :: type_some_opaque(), some_string :: type_some_string(), max_string :: type_max_string()) :: t() def new( %Int{} = some_int, %Int64{} = a_big_int, diff --git a/spec/output/generator_spec_elixir/struct.x/opaque10.ex b/spec/output/generator_spec_elixir/struct.x/opaque10.ex index 02dc7a497..dc9af8053 100644 --- a/spec/output/generator_spec_elixir/struct.x/opaque10.ex +++ b/spec/output/generator_spec_elixir/struct.x/opaque10.ex @@ -45,7 +45,7 @@ defmodule MyXDR.Opaque10 do def decode_xdr!(bytes, spec \\ @opaque_spec) def decode_xdr!(bytes, spec) do - {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes) + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) {new(opaque), rest} end end diff --git a/spec/output/generator_spec_elixir/struct.x/string100.ex b/spec/output/generator_spec_elixir/struct.x/string100.ex index fc11da7b7..5c6da4943 100644 --- a/spec/output/generator_spec_elixir/struct.x/string100.ex +++ b/spec/output/generator_spec_elixir/struct.x/string100.ex @@ -14,7 +14,7 @@ defmodule MyXDR.String100 do defstruct [:value] - @max_lenght 100 + @max_length 100 @spec new(value :: String.t()) :: t() def new(value), do: %__MODULE__{value: value} diff --git a/spec/output/generator_spec_elixir/test.x/base.ex b/spec/output/generator_spec_elixir/test.x/base.ex index d54324fd3..3164dc83e 100644 --- a/spec/output/generator_spec_elixir/test.x/base.ex +++ b/spec/output/generator_spec_elixir/test.x/base.ex @@ -41,9 +41,9 @@ defmodule MyXDR.Int do end end -defmodule MyXDR.UInt do +defmodule MyXDR.Uint do @moduledoc """ - Representation of Stellar `UInt` type. + Representation of Stellar `Uint` type. """ @behaviour XDR.Declaration @@ -91,21 +91,21 @@ defmodule MyXDR.Float do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr(%XDR.Float{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.Float.encode_xdr(%XDR.Float{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.Float.encode_xdr!(%XDR.Float{float: float}) end @impl true @@ -113,7 +113,7 @@ defmodule MyXDR.Float do def decode_xdr(bytes, _term) do case XDR.Float.decode_xdr(bytes) do - {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.Float{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -122,7 +122,7 @@ defmodule MyXDR.Float do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {%XDR.Float{float: float}, rest} = XDR.Float.decode_xdr!(bytes) {new(float), rest} end end @@ -134,21 +134,21 @@ defmodule MyXDR.DoubleFloat do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{float: float}) end @impl true @@ -156,7 +156,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr(bytes, _term) do case XDR.DoubleFloat.decode_xdr(bytes) do - {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.DoubleFloat{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -165,7 +165,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {%XDR.DoubleFloat{float: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) {new(float), rest} end end @@ -314,7 +314,7 @@ defmodule MyXDR.FixedOpaque do defstruct [:opaque] - @length = 4_294_967_295 + @length 4_294_967_295 @opaque_spec XDR.FixedOpaque.new(nil, @length) diff --git a/spec/output/generator_spec_elixir/test.x/has_stuff.ex b/spec/output/generator_spec_elixir/test.x/has_stuff.ex index c56e05cb5..f8761bee4 100644 --- a/spec/output/generator_spec_elixir/test.x/has_stuff.ex +++ b/spec/output/generator_spec_elixir/test.x/has_stuff.ex @@ -18,13 +18,13 @@ defmodule MyXDR.HasStuff do data: LotsOfMyStructs ) - @type data :: LotsOfMyStructs.t() + @type type_data :: LotsOfMyStructs.t() - @type t :: %__MODULE__{data: data()} + @type t :: %__MODULE__{data: type_data()} defstruct [:data] - @spec new(data :: data()) :: t() + @spec new(data :: type_data()) :: t() def new( %LotsOfMyStructs{} = data ), diff --git a/spec/output/generator_spec_elixir/test.x/hash.ex b/spec/output/generator_spec_elixir/test.x/hash.ex index 74f35b253..ccbfb3489 100644 --- a/spec/output/generator_spec_elixir/test.x/hash.ex +++ b/spec/output/generator_spec_elixir/test.x/hash.ex @@ -27,18 +27,18 @@ defmodule MyXDR.Hash do end @impl true - def encode_xdr!(%__MODULE__{opaque: opaque}) do + def encode_xdr!(%__MODULE__{value: value}) do value |> Opaque32.new() - |> Opaque32.encode_xdr() + |> Opaque32.encode_xdr!() end @impl true def decode_xdr(bytes, term \\ nil) def decode_xdr(bytes, _term) do - case XDR.Opaque32.decode_xdr(bytes, term) do - {:ok, {%XDR.Opaque32{opaque: value}, rest}} -> {:ok, {new(value), rest}} + case Opaque32.decode_xdr(bytes) do + {:ok, {%Opaque32{opaque: value}, rest}} -> {:ok, {new(value), rest}} error -> error end end @@ -47,7 +47,7 @@ defmodule MyXDR.Hash do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.Opaque32{opaque: value}, rest} = XDR.Opaque32.decode_xdr!(bytes) + {%Opaque32{opaque: value}, rest} = Opaque32.decode_xdr!(bytes) {new(value), rest} end end diff --git a/spec/output/generator_spec_elixir/test.x/hashes1.ex b/spec/output/generator_spec_elixir/test.x/hashes1.ex index 2173d3477..f9598d0ba 100644 --- a/spec/output/generator_spec_elixir/test.x/hashes1.ex +++ b/spec/output/generator_spec_elixir/test.x/hashes1.ex @@ -53,7 +53,7 @@ defmodule MyXDR.Hashes1 do def decode_xdr!(bytes, spec \\ @array_spec) def decode_xdr!(bytes, spec) do - {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {items, rest} = XDR.FixedArray.decode_xdr!(bytes, spec) {new(items), rest} end end diff --git a/spec/output/generator_spec_elixir/test.x/hashes2.ex b/spec/output/generator_spec_elixir/test.x/hashes2.ex index 1f8612f47..d03319f9e 100644 --- a/spec/output/generator_spec_elixir/test.x/hashes2.ex +++ b/spec/output/generator_spec_elixir/test.x/hashes2.ex @@ -53,7 +53,7 @@ defmodule MyXDR.Hashes2 do def decode_xdr!(bytes, spec \\ @array_spec) def decode_xdr!(bytes, spec) do - {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {items, rest} = XDR.VariableArray.decode_xdr!(bytes, spec) {new(items), rest} end end diff --git a/spec/output/generator_spec_elixir/test.x/hashes3.ex b/spec/output/generator_spec_elixir/test.x/hashes3.ex index cdd5d84f3..76be0897e 100644 --- a/spec/output/generator_spec_elixir/test.x/hashes3.ex +++ b/spec/output/generator_spec_elixir/test.x/hashes3.ex @@ -51,7 +51,7 @@ defmodule MyXDR.Hashes3 do def decode_xdr!(bytes, spec \\ @array_spec) def decode_xdr!(bytes, spec) do - {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {items, rest} = XDR.VariableArray.decode_xdr!(bytes, spec) {new(items), rest} end end diff --git a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex index 9ce65d0fb..4891576f3 100644 --- a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex +++ b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex @@ -18,13 +18,13 @@ defmodule MyXDR.LotsOfMyStructs do members: MyStructList ) - @type members :: MyStructList.t() + @type type_members :: MyStructList.t() - @type t :: %__MODULE__{members: members()} + @type t :: %__MODULE__{members: type_members()} defstruct [:members] - @spec new(members :: members()) :: t() + @spec new(members :: type_members()) :: t() def new( %MyStructList{} = members ), diff --git a/spec/output/generator_spec_elixir/test.x/my_struct.ex b/spec/output/generator_spec_elixir/test.x/my_struct.ex index 4e3bbc652..a204a79eb 100644 --- a/spec/output/generator_spec_elixir/test.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/test.x/my_struct.ex @@ -30,19 +30,19 @@ defmodule MyXDR.MyStruct do field7: Bool ) - @type field1 :: Uint512.t() - @type field2 :: OptHash1.t() - @type field3 :: Int1.t() - @type field4 :: UInt.t() - @type field5 :: Float.t() - @type field6 :: DoubleFloat.t() - @type field7 :: Bool.t() + @type type_field1 :: Uint512.t() + @type type_field2 :: OptHash1.t() + @type type_field3 :: Int1.t() + @type type_field4 :: UInt.t() + @type type_field5 :: Float.t() + @type type_field6 :: DoubleFloat.t() + @type type_field7 :: Bool.t() - @type t :: %__MODULE__{field1: field1(), field2: field2(), field3: field3(), field4: field4(), field5: field5(), field6: field6(), field7: field7()} + @type t :: %__MODULE__{field1: type_field1(), field2: type_field2(), field3: type_field3(), field4: type_field4(), field5: type_field5(), field6: type_field6(), field7: type_field7()} defstruct [:field1, :field2, :field3, :field4, :field5, :field6, :field7] - @spec new(field1 :: field1(), field2 :: field2(), field3 :: field3(), field4 :: field4(), field5 :: field5(), field6 :: field6(), field7 :: field7()) :: t() + @spec new(field1 :: type_field1(), field2 :: type_field2(), field3 :: type_field3(), field4 :: type_field4(), field5 :: type_field5(), field6 :: type_field6(), field7 :: type_field7()) :: t() def new( %Uint512{} = field1, %OptHash1{} = field2, diff --git a/spec/output/generator_spec_elixir/test.x/my_struct_list.ex b/spec/output/generator_spec_elixir/test.x/my_struct_list.ex index 338f57f5a..590d68c1f 100644 --- a/spec/output/generator_spec_elixir/test.x/my_struct_list.ex +++ b/spec/output/generator_spec_elixir/test.x/my_struct_list.ex @@ -51,7 +51,7 @@ defmodule MyXDR.MyStructList do def decode_xdr!(bytes, spec \\ @array_spec) def decode_xdr!(bytes, spec) do - {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {items, rest} = XDR.VariableArray.decode_xdr!(bytes, spec) {new(items), rest} end end diff --git a/spec/output/generator_spec_elixir/test.x/nester.ex b/spec/output/generator_spec_elixir/test.x/nester.ex index faf108cb4..0b12d18db 100644 --- a/spec/output/generator_spec_elixir/test.x/nester.ex +++ b/spec/output/generator_spec_elixir/test.x/nester.ex @@ -22,15 +22,15 @@ defmodule MyXDR.Nester do nested_union: NesterNestedUnion ) - @type nested_enum :: NesterNestedEnum.t() - @type nested_struct :: NesterNestedStruct.t() - @type nested_union :: NesterNestedUnion.t() + @type type_nested_enum :: NesterNestedEnum.t() + @type type_nested_struct :: NesterNestedStruct.t() + @type type_nested_union :: NesterNestedUnion.t() - @type t :: %__MODULE__{nested_enum: nested_enum(), nested_struct: nested_struct(), nested_union: nested_union()} + @type t :: %__MODULE__{nested_enum: type_nested_enum(), nested_struct: type_nested_struct(), nested_union: type_nested_union()} defstruct [:nested_enum, :nested_struct, :nested_union] - @spec new(nested_enum :: nested_enum(), nested_struct :: nested_struct(), nested_union :: nested_union()) :: t() + @spec new(nested_enum :: type_nested_enum(), nested_struct :: type_nested_struct(), nested_union :: type_nested_union()) :: t() def new( %NesterNestedEnum{} = nested_enum, %NesterNestedStruct{} = nested_struct, diff --git a/spec/output/generator_spec_elixir/test.x/nester_nested_struct.ex b/spec/output/generator_spec_elixir/test.x/nester_nested_struct.ex index cef0c6419..c15de868e 100644 --- a/spec/output/generator_spec_elixir/test.x/nester_nested_struct.ex +++ b/spec/output/generator_spec_elixir/test.x/nester_nested_struct.ex @@ -18,13 +18,13 @@ defmodule MyXDR.NesterNestedStruct do blah: Int ) - @type blah :: Int.t() + @type type_blah :: Int.t() - @type t :: %__MODULE__{blah: blah()} + @type t :: %__MODULE__{blah: type_blah()} defstruct [:blah] - @spec new(blah :: blah()) :: t() + @spec new(blah :: type_blah()) :: t() def new( %Int{} = blah ), diff --git a/spec/output/generator_spec_elixir/test.x/opaque32.ex b/spec/output/generator_spec_elixir/test.x/opaque32.ex index 7f6eeb03e..6810a6966 100644 --- a/spec/output/generator_spec_elixir/test.x/opaque32.ex +++ b/spec/output/generator_spec_elixir/test.x/opaque32.ex @@ -45,7 +45,7 @@ defmodule MyXDR.Opaque32 do def decode_xdr!(bytes, spec \\ @opaque_spec) def decode_xdr!(bytes, spec) do - {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes) + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) {new(opaque), rest} end end diff --git a/spec/output/generator_spec_elixir/test.x/opaque64.ex b/spec/output/generator_spec_elixir/test.x/opaque64.ex index 1cbbdaa2f..b9a38092a 100644 --- a/spec/output/generator_spec_elixir/test.x/opaque64.ex +++ b/spec/output/generator_spec_elixir/test.x/opaque64.ex @@ -45,7 +45,7 @@ defmodule MyXDR.Opaque64 do def decode_xdr!(bytes, spec \\ @opaque_spec) def decode_xdr!(bytes, spec) do - {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes) + {%XDR.FixedOpaque{opaque: opaque}, rest} = XDR.FixedOpaque.decode_xdr!(bytes, spec) {new(opaque), rest} end end diff --git a/spec/output/generator_spec_elixir/test.x/opt_hash1.ex b/spec/output/generator_spec_elixir/test.x/opt_hash1.ex index c3c1e6128..b588e1006 100644 --- a/spec/output/generator_spec_elixir/test.x/opt_hash1.ex +++ b/spec/output/generator_spec_elixir/test.x/opt_hash1.ex @@ -52,8 +52,10 @@ defmodule MyXDR.OptHash1 do def decode_xdr!(bytes, optional_spec \\ @optional_spec) def decode_xdr!(bytes, optional_spec) do - {%XDR.Optional{identifier: hash}, rest} = XDR.Optional.decode_xdr!(bytes) - {new(hash), rest} - {nil, rest} -> {new(), rest} + case XDR.Optional.decode_xdr!(bytes, optional_spec) do + {%XDR.Optional{type: hash}, rest} -> {new(hash), rest} + {nil, rest} -> {new(), rest} + end end + end diff --git a/spec/output/generator_spec_elixir/test.x/opt_hash2.ex b/spec/output/generator_spec_elixir/test.x/opt_hash2.ex index d02c19783..1fe8f376a 100644 --- a/spec/output/generator_spec_elixir/test.x/opt_hash2.ex +++ b/spec/output/generator_spec_elixir/test.x/opt_hash2.ex @@ -52,8 +52,10 @@ defmodule MyXDR.OptHash2 do def decode_xdr!(bytes, optional_spec \\ @optional_spec) def decode_xdr!(bytes, optional_spec) do - {%XDR.Optional{identifier: hash}, rest} = XDR.Optional.decode_xdr!(bytes) - {new(hash), rest} - {nil, rest} -> {new(), rest} + case XDR.Optional.decode_xdr!(bytes, optional_spec) do + {%XDR.Optional{type: hash}, rest} -> {new(hash), rest} + {nil, rest} -> {new(), rest} + end end + end diff --git a/spec/output/generator_spec_elixir/test.x/str.ex b/spec/output/generator_spec_elixir/test.x/str.ex index 78aecf45d..5317acebe 100644 --- a/spec/output/generator_spec_elixir/test.x/str.ex +++ b/spec/output/generator_spec_elixir/test.x/str.ex @@ -14,7 +14,7 @@ defmodule MyXDR.Str do defstruct [:value] - @max_lenght 64 + @max_length 64 @spec new(value :: String.t()) :: t() def new(value), do: %__MODULE__{value: value} diff --git a/spec/output/generator_spec_elixir/test.x/uint512.ex b/spec/output/generator_spec_elixir/test.x/uint512.ex index e7c884598..f68066f3e 100644 --- a/spec/output/generator_spec_elixir/test.x/uint512.ex +++ b/spec/output/generator_spec_elixir/test.x/uint512.ex @@ -1,11 +1,11 @@ -defmodule MyXDR.UInt512 do +defmodule MyXDR.Uint512 do @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - Representation of Stellar `UInt512` type. + Representation of Stellar `Uint512` type. """ @behaviour XDR.Declaration @@ -27,18 +27,18 @@ defmodule MyXDR.UInt512 do end @impl true - def encode_xdr!(%__MODULE__{opaque: opaque}) do + def encode_xdr!(%__MODULE__{value: value}) do value |> Opaque64.new() - |> Opaque64.encode_xdr() + |> Opaque64.encode_xdr!() end @impl true def decode_xdr(bytes, term \\ nil) def decode_xdr(bytes, _term) do - case XDR.Opaque64.decode_xdr(bytes, term) do - {:ok, {%XDR.Opaque64{opaque: value}, rest}} -> {:ok, {new(value), rest}} + case Opaque64.decode_xdr(bytes) do + {:ok, {%Opaque64{opaque: value}, rest}} -> {:ok, {new(value), rest}} error -> error end end @@ -47,7 +47,7 @@ defmodule MyXDR.UInt512 do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.Opaque64{opaque: value}, rest} = XDR.Opaque64.decode_xdr!(bytes) + {%Opaque64{opaque: value}, rest} = Opaque64.decode_xdr!(bytes) {new(value), rest} end end diff --git a/spec/output/generator_spec_elixir/test.x/uint513.ex b/spec/output/generator_spec_elixir/test.x/uint513.ex index 301c6f304..8ab304b73 100644 --- a/spec/output/generator_spec_elixir/test.x/uint513.ex +++ b/spec/output/generator_spec_elixir/test.x/uint513.ex @@ -1,11 +1,11 @@ -defmodule MyXDR.UInt513 do +defmodule MyXDR.Uint513 do @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - Representation of Stellar `UInt513` type. + Representation of Stellar `Uint513` type. """ @behaviour XDR.Declaration @@ -27,18 +27,18 @@ defmodule MyXDR.UInt513 do end @impl true - def encode_xdr!(%__MODULE__{opaque: opaque}) do + def encode_xdr!(%__MODULE__{value: value}) do value |> VariableOpaque64.new() - |> VariableOpaque64.encode_xdr() + |> VariableOpaque64.encode_xdr!() end @impl true def decode_xdr(bytes, term \\ nil) def decode_xdr(bytes, _term) do - case XDR.VariableOpaque64.decode_xdr(bytes, term) do - {:ok, {%XDR.VariableOpaque64{opaque: value}, rest}} -> {:ok, {new(value), rest}} + case VariableOpaque64.decode_xdr(bytes) do + {:ok, {%VariableOpaque64{opaque: value}, rest}} -> {:ok, {new(value), rest}} error -> error end end @@ -47,7 +47,7 @@ defmodule MyXDR.UInt513 do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.VariableOpaque64{opaque: value}, rest} = XDR.VariableOpaque64.decode_xdr!(bytes) + {%VariableOpaque64{opaque: value}, rest} = VariableOpaque64.decode_xdr!(bytes) {new(value), rest} end end diff --git a/spec/output/generator_spec_elixir/test.x/uint514.ex b/spec/output/generator_spec_elixir/test.x/uint514.ex index f7f5846ef..5ce4981f2 100644 --- a/spec/output/generator_spec_elixir/test.x/uint514.ex +++ b/spec/output/generator_spec_elixir/test.x/uint514.ex @@ -1,11 +1,11 @@ -defmodule MyXDR.UInt514 do +defmodule MyXDR.Uint514 do @moduledoc """ Automatically generated by xdrgen DO NOT EDIT or your changes may be overwritten Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr - Representation of Stellar `UInt514` type. + Representation of Stellar `Uint514` type. """ @behaviour XDR.Declaration @@ -27,18 +27,18 @@ defmodule MyXDR.UInt514 do end @impl true - def encode_xdr!(%__MODULE__{opaque: opaque}) do + def encode_xdr!(%__MODULE__{value: value}) do value |> VariableOpaque.new() - |> VariableOpaque.encode_xdr() + |> VariableOpaque.encode_xdr!() end @impl true def decode_xdr(bytes, term \\ nil) def decode_xdr(bytes, _term) do - case XDR.VariableOpaque.decode_xdr(bytes, term) do - {:ok, {%XDR.VariableOpaque{opaque: value}, rest}} -> {:ok, {new(value), rest}} + case VariableOpaque.decode_xdr(bytes) do + {:ok, {%VariableOpaque{opaque: value}, rest}} -> {:ok, {new(value), rest}} error -> error end end @@ -47,7 +47,7 @@ defmodule MyXDR.UInt514 do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.VariableOpaque{opaque: value}, rest} = XDR.VariableOpaque.decode_xdr!(bytes) + {%VariableOpaque{opaque: value}, rest} = VariableOpaque.decode_xdr!(bytes) {new(value), rest} end end diff --git a/spec/output/generator_spec_elixir/test.x/variable_opaque64.ex b/spec/output/generator_spec_elixir/test.x/variable_opaque64.ex index 323c547bc..257176546 100644 --- a/spec/output/generator_spec_elixir/test.x/variable_opaque64.ex +++ b/spec/output/generator_spec_elixir/test.x/variable_opaque64.ex @@ -45,7 +45,7 @@ defmodule MyXDR.VariableOpaque64 do def decode_xdr!(bytes, spec \\ @opaque_spec) def decode_xdr!(bytes, spec) do - {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes) + {%XDR.VariableOpaque{opaque: opaque}, rest} = XDR.VariableOpaque.decode_xdr!(bytes, spec) {new(opaque), rest} end end diff --git a/spec/output/generator_spec_elixir/union.x/base.ex b/spec/output/generator_spec_elixir/union.x/base.ex index d54324fd3..3164dc83e 100644 --- a/spec/output/generator_spec_elixir/union.x/base.ex +++ b/spec/output/generator_spec_elixir/union.x/base.ex @@ -41,9 +41,9 @@ defmodule MyXDR.Int do end end -defmodule MyXDR.UInt do +defmodule MyXDR.Uint do @moduledoc """ - Representation of Stellar `UInt` type. + Representation of Stellar `Uint` type. """ @behaviour XDR.Declaration @@ -91,21 +91,21 @@ defmodule MyXDR.Float do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr(%XDR.Float{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.Float.encode_xdr(%XDR.Float{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.Float.encode_xdr!(%XDR.Float{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.Float.encode_xdr!(%XDR.Float{float: float}) end @impl true @@ -113,7 +113,7 @@ defmodule MyXDR.Float do def decode_xdr(bytes, _term) do case XDR.Float.decode_xdr(bytes) do - {:ok, {%XDR.Float{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.Float{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -122,7 +122,7 @@ defmodule MyXDR.Float do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.Float{datum: float}, rest} = XDR.Float.decode_xdr!(bytes) + {%XDR.Float{float: float}, rest} = XDR.Float.decode_xdr!(bytes) {new(float), rest} end end @@ -134,21 +134,21 @@ defmodule MyXDR.DoubleFloat do @behaviour XDR.Declaration - @type t :: %__MODULE__{datum: float()} + @type t :: %__MODULE__{float: float()} - defstruct [:datum] + defstruct [:float] @spec new(float :: float()) :: t() - def new(float), do: %__MODULE__{datum: float} + def new(float), do: %__MODULE__{float: float} @impl true - def encode_xdr(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{datum: float}) + def encode_xdr(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr(%XDR.DoubleFloat{float: float}) end @impl true - def encode_xdr!(%__MODULE__{datum: float}) do - XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{datum: float}) + def encode_xdr!(%__MODULE__{float: float}) do + XDR.DoubleFloat.encode_xdr!(%XDR.DoubleFloat{float: float}) end @impl true @@ -156,7 +156,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr(bytes, _term) do case XDR.DoubleFloat.decode_xdr(bytes) do - {:ok, {%XDR.DoubleFloat{datum: float}, rest}} -> {:ok, {new(float), rest}} + {:ok, {%XDR.DoubleFloat{float: float}, rest}} -> {:ok, {new(float), rest}} error -> error end end @@ -165,7 +165,7 @@ defmodule MyXDR.DoubleFloat do def decode_xdr!(bytes, term \\ nil) def decode_xdr!(bytes, _term) do - {%XDR.DoubleFloat{datum: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) + {%XDR.DoubleFloat{float: float}, rest} = XDR.DoubleFloat.decode_xdr!(bytes) {new(float), rest} end end @@ -314,7 +314,7 @@ defmodule MyXDR.FixedOpaque do defstruct [:opaque] - @length = 4_294_967_295 + @length 4_294_967_295 @opaque_spec XDR.FixedOpaque.new(nil, @length) diff --git a/spec/output/generator_spec_elixir/union.x/multi_list.ex b/spec/output/generator_spec_elixir/union.x/multi_list.ex index 2e3136a55..38b20e31d 100644 --- a/spec/output/generator_spec_elixir/union.x/multi_list.ex +++ b/spec/output/generator_spec_elixir/union.x/multi_list.ex @@ -51,7 +51,7 @@ defmodule MyXDR.MultiList do def decode_xdr!(bytes, spec \\ @array_spec) def decode_xdr!(bytes, spec) do - {items, rest} = XDR.{list_type}.decode_xdr!(bytes, spec) + {items, rest} = XDR.VariableArray.decode_xdr!(bytes, spec) {new(items), rest} end end From 4df6527feb3e9e147d71f479423eabb82840651e Mon Sep 17 00:00:00 2001 From: Miguel Nieto <39246879+miguelnietoa@users.noreply.github.com> Date: Thu, 11 May 2023 10:06:12 -0500 Subject: [PATCH 10/13] Update README (#11) --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index edafc0047..d2c81d994 100644 --- a/README.md +++ b/README.md @@ -16,18 +16,16 @@ Xdrgen is a very early project. Aside from the test fixtures in are the .x files used for the [stellar-core project](https://github.com/stellar/stellar-core). -Xdrgen presently supports these output languages: ruby, javacript, java, -golang, and elixir: +Xdrgen presently supports these output languages: ruby, javacript, java, golang, and elixir: - ruby: complete support - javascript: complete support - java: complete support - golang: currently using a fork of go-xdr, but has complete support - rust: support is experimental. Default arms and floats are not supported. -- elixir: support is experimental as the SDK is in early development. Generated - code requires [:exdr](https://github.com/revelrylabs/exdr) in your deps +- elixir: complete support. Generated code requires [:elixir_xdr](https://github.com/kommitters/elixir_xdr) in your deps. - C#: complete support - + Testing is _very_ sparse, but will improve over time. ## Usage as a binary From 50141719a3de2a9d06864d0ddb582cebd00862ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elisabet=20Casta=C3=B1o=20Salazar?= Date: Thu, 11 May 2023 10:55:26 -0500 Subject: [PATCH 11/13] Fix typo --- lib/xdrgen/generators/elixir.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index 8b6189c42..8bea39e63 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -393,7 +393,7 @@ def render_union(union) arm_name = arm.void? ? "Void" : "#{type_reference arm, arm.name.camelize}" unless arm.void? if arm.declaration.type.sub_type == :var_array - arm_name = add_size_to_name(m, arm_name) + arm_name = add_size_to_name(arm, arm_name) end end arm.cases.each_with_index do |acase, o| From b7aee625b7348820ea87cd6308e1820a8677dbff Mon Sep 17 00:00:00 2001 From: Elisabet Salazar <40662951+elisa6@users.noreply.github.com> Date: Fri, 12 May 2023 16:44:05 -0500 Subject: [PATCH 12/13] Fix union arms & consts (#12) * Fix union arms * Fix problems with consts --------- Co-authored-by: jenietoc --- lib/xdrgen/generators/elixir.rb | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index 8bea39e63..31dfcc8de 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -5,6 +5,8 @@ class Elixir < Xdrgen::Generators::Base def generate @constants = Hash.new + + render_consts_definitions(@top) render_definitions(@top) render_base_classes end @@ -15,6 +17,11 @@ def render_definitions(node) node.namespaces.each{|n| render_definitions n } end + def render_consts_definitions(node) + node.definitions.each{|n| render_consts n } + node.namespaces.each{|n| render_consts_definitions n } + end + def render_nested_definitions(defn) return unless defn.respond_to? :nested_definitions defn.nested_definitions.each{|ndefn| render_definition ndefn} @@ -32,7 +39,12 @@ def render_definition(defn) render_union defn when AST::Definitions::Typedef ; render_typedef(defn, false) - when AST::Definitions::Const ; + end + end + + def render_consts(defn) + case defn + when AST::Definitions::Const; render_const defn end end @@ -398,7 +410,7 @@ def render_union(union) end arm.cases.each_with_index do |acase, o| switch = if acase.value.is_a?(AST::Identifier) - "#{member_name(acase.value)}:" + "#{acase.value.text_value}:" else "#{acase.value.text_value} =>" end @@ -541,10 +553,6 @@ def is_number_type?(union) value end - def member_name(member) - name(member).underscore.upcase - end - def type_reference(decl, container_name) type_hint = type_string decl.type From 421a589ed1f87b24ba813bc2ec142a7ee45558e6 Mon Sep 17 00:00:00 2001 From: Juan Esteban Nieto Cifuentes <89233604+Jenietoc@users.noreply.github.com> Date: Thu, 18 May 2023 15:28:09 -0500 Subject: [PATCH 13/13] Fix union bug (#13) * Fix union bug * Refactor some code * New changes --- lib/xdrgen/generators/elixir.rb | 15 +++++++++------ .../nesting.x/my_union_one.ex | 6 +++--- .../nesting.x/my_union_two.ex | 8 ++++---- .../optional.x/has_options.ex | 10 +++++----- .../struct.x/my_struct.ex | 14 +++++++------- .../generator_spec_elixir/test.x/has_stuff.ex | 6 +++--- .../test.x/lots_of_my_structs.ex | 6 +++--- .../generator_spec_elixir/test.x/my_struct.ex | 18 +++++++++--------- .../generator_spec_elixir/test.x/nester.ex | 10 +++++----- .../test.x/nester_nested_struct.ex | 6 +++--- .../generator_spec_elixir/union.x/int_union.ex | 8 +++++--- 11 files changed, 56 insertions(+), 51 deletions(-) diff --git a/lib/xdrgen/generators/elixir.rb b/lib/xdrgen/generators/elixir.rb index 31dfcc8de..959acb22d 100644 --- a/lib/xdrgen/generators/elixir.rb +++ b/lib/xdrgen/generators/elixir.rb @@ -161,13 +161,13 @@ def render_struct(struct) if m.declaration.type.sub_type == :var_array module_name = add_size_to_name(m, module_name) end - out.puts "@type type_#{m.name.underscore.downcase} :: #{module_name}.t()" + out.puts "@type #{m.name.underscore.downcase}_type :: #{module_name}.t()" end out.puts "\n" types = "@type t :: %__MODULE__{" struct.members.each_with_index do |m, i| - types += "#{m.name.underscore.downcase}: type_#{m.name.underscore.downcase}()#{comma_and_space_unless_last(i, struct.members)}" + types += "#{m.name.underscore.downcase}: #{m.name.underscore.downcase}_type()#{comma_and_space_unless_last(i, struct.members)}" end types += "}\n\n" out.puts types @@ -181,7 +181,7 @@ def render_struct(struct) spec = "@spec new(" struct.members.each_with_index do |m, i| - spec += "#{m.name.underscore.downcase} :: type_#{m.name.underscore.downcase}()#{comma_and_space_unless_last(i, struct.members)}" + spec += "#{m.name.underscore.downcase} :: #{m.name.underscore.downcase}_type()#{comma_and_space_unless_last(i, struct.members)}" end spec += ") :: t()\n" out.puts spec @@ -451,17 +451,19 @@ def render_union(union) end out.puts "\n" - out.puts "@type t :: %__MODULE__{value: value(), type: #{type_reference union_discriminant, union_name_camelize}.t()}\n\n" + out.puts "@type t :: %__MODULE__{value: value(), type: #{is_number_type ? "integer()" : "#{type_reference(union_discriminant, union_name_camelize)}.t()"}}\n\n" out.puts "defstruct [:value, :type]\n\n" - out.puts "@spec new(value :: value(), type :: #{type_reference union_discriminant, union_name_camelize}.t()) :: t()\n" - out.puts "def new(value, %#{type_reference union_discriminant, union_name_camelize}{} = type), do: %__MODULE__{value: value, type: type}\n\n" + out.puts "@spec new(value :: value(), type :: #{is_number_type ? "integer()" : "#{type_reference(union_discriminant, union_name_camelize)}.t()"}) :: t()\n" + + out.puts "def new(value, #{is_number_type ? "" : "%#{type_reference(union_discriminant, union_name_camelize)}{} = "}type), do: %__MODULE__{value: value, type: type}\n\n" out.puts "@impl true" out.puts "def encode_xdr(%__MODULE__{value: value, type: type}) do\n" out.indent do out.puts "type\n" + out.puts "|> #{type_reference(union_discriminant, union_name_camelize)}.new()" if is_number_type out.puts "|> XDR.Union.new(@arms, value)\n" out.puts "|> XDR.Union.encode_xdr()\n" end @@ -471,6 +473,7 @@ def render_union(union) out.puts "def encode_xdr!(%__MODULE__{value: value, type: type}) do\n" out.indent do out.puts "type\n" + out.puts "|> #{type_reference(union_discriminant, union_name_camelize)}.new()" if is_number_type out.puts "|> XDR.Union.new(@arms, value)\n" out.puts "|> XDR.Union.encode_xdr!()\n" end diff --git a/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex b/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex index 9434d3ca8..74c987ffb 100644 --- a/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex +++ b/spec/output/generator_spec_elixir/nesting.x/my_union_one.ex @@ -18,13 +18,13 @@ defmodule MyXDR.MyUnionOne do some_int: Int ) - @type type_some_int :: Int.t() + @type some_int_type :: Int.t() - @type t :: %__MODULE__{some_int: type_some_int()} + @type t :: %__MODULE__{some_int: some_int_type()} defstruct [:some_int] - @spec new(some_int :: type_some_int()) :: t() + @spec new(some_int :: some_int_type()) :: t() def new( %Int{} = some_int ), diff --git a/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex b/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex index 30cd879e9..bad1ea7ea 100644 --- a/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex +++ b/spec/output/generator_spec_elixir/nesting.x/my_union_two.ex @@ -20,14 +20,14 @@ defmodule MyXDR.MyUnionTwo do foo: Foo ) - @type type_some_int :: Int.t() - @type type_foo :: Foo.t() + @type some_int_type :: Int.t() + @type foo_type :: Foo.t() - @type t :: %__MODULE__{some_int: type_some_int(), foo: type_foo()} + @type t :: %__MODULE__{some_int: some_int_type(), foo: foo_type()} defstruct [:some_int, :foo] - @spec new(some_int :: type_some_int(), foo :: type_foo()) :: t() + @spec new(some_int :: some_int_type(), foo :: foo_type()) :: t() def new( %Int{} = some_int, %Foo{} = foo diff --git a/spec/output/generator_spec_elixir/optional.x/has_options.ex b/spec/output/generator_spec_elixir/optional.x/has_options.ex index df7976e6a..0c3329d85 100644 --- a/spec/output/generator_spec_elixir/optional.x/has_options.ex +++ b/spec/output/generator_spec_elixir/optional.x/has_options.ex @@ -21,15 +21,15 @@ defmodule MyXDR.HasOptions do third_option: OptionalArr ) - @type type_first_option :: OptionalInt.t() - @type type_second_option :: OptionalInt.t() - @type type_third_option :: OptionalArr.t() + @type first_option_type :: OptionalInt.t() + @type second_option_type :: OptionalInt.t() + @type third_option_type :: OptionalArr.t() - @type t :: %__MODULE__{first_option: type_first_option(), second_option: type_second_option(), third_option: type_third_option()} + @type t :: %__MODULE__{first_option: first_option_type(), second_option: second_option_type(), third_option: third_option_type()} defstruct [:first_option, :second_option, :third_option] - @spec new(first_option :: type_first_option(), second_option :: type_second_option(), third_option :: type_third_option()) :: t() + @spec new(first_option :: first_option_type(), second_option :: second_option_type(), third_option :: third_option_type()) :: t() def new( %OptionalInt{} = first_option, %OptionalInt{} = second_option, diff --git a/spec/output/generator_spec_elixir/struct.x/my_struct.ex b/spec/output/generator_spec_elixir/struct.x/my_struct.ex index 04e2b7299..bc4e094bb 100644 --- a/spec/output/generator_spec_elixir/struct.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/struct.x/my_struct.ex @@ -26,17 +26,17 @@ defmodule MyXDR.MyStruct do max_string: String100 ) - @type type_some_int :: Int.t() - @type type_a_big_int :: Int64.t() - @type type_some_opaque :: Opaque10.t() - @type type_some_string :: String.t() - @type type_max_string :: String100.t() + @type some_int_type :: Int.t() + @type a_big_int_type :: Int64.t() + @type some_opaque_type :: Opaque10.t() + @type some_string_type :: String.t() + @type max_string_type :: String100.t() - @type t :: %__MODULE__{some_int: type_some_int(), a_big_int: type_a_big_int(), some_opaque: type_some_opaque(), some_string: type_some_string(), max_string: type_max_string()} + @type t :: %__MODULE__{some_int: some_int_type(), a_big_int: a_big_int_type(), some_opaque: some_opaque_type(), some_string: some_string_type(), max_string: max_string_type()} defstruct [:some_int, :a_big_int, :some_opaque, :some_string, :max_string] - @spec new(some_int :: type_some_int(), a_big_int :: type_a_big_int(), some_opaque :: type_some_opaque(), some_string :: type_some_string(), max_string :: type_max_string()) :: t() + @spec new(some_int :: some_int_type(), a_big_int :: a_big_int_type(), some_opaque :: some_opaque_type(), some_string :: some_string_type(), max_string :: max_string_type()) :: t() def new( %Int{} = some_int, %Int64{} = a_big_int, diff --git a/spec/output/generator_spec_elixir/test.x/has_stuff.ex b/spec/output/generator_spec_elixir/test.x/has_stuff.ex index f8761bee4..48c379773 100644 --- a/spec/output/generator_spec_elixir/test.x/has_stuff.ex +++ b/spec/output/generator_spec_elixir/test.x/has_stuff.ex @@ -18,13 +18,13 @@ defmodule MyXDR.HasStuff do data: LotsOfMyStructs ) - @type type_data :: LotsOfMyStructs.t() + @type data_type :: LotsOfMyStructs.t() - @type t :: %__MODULE__{data: type_data()} + @type t :: %__MODULE__{data: data_type()} defstruct [:data] - @spec new(data :: type_data()) :: t() + @spec new(data :: data_type()) :: t() def new( %LotsOfMyStructs{} = data ), diff --git a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex index 4891576f3..b1b87b08f 100644 --- a/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex +++ b/spec/output/generator_spec_elixir/test.x/lots_of_my_structs.ex @@ -18,13 +18,13 @@ defmodule MyXDR.LotsOfMyStructs do members: MyStructList ) - @type type_members :: MyStructList.t() + @type members_type :: MyStructList.t() - @type t :: %__MODULE__{members: type_members()} + @type t :: %__MODULE__{members: members_type()} defstruct [:members] - @spec new(members :: type_members()) :: t() + @spec new(members :: members_type()) :: t() def new( %MyStructList{} = members ), diff --git a/spec/output/generator_spec_elixir/test.x/my_struct.ex b/spec/output/generator_spec_elixir/test.x/my_struct.ex index a204a79eb..f4c2aa8c1 100644 --- a/spec/output/generator_spec_elixir/test.x/my_struct.ex +++ b/spec/output/generator_spec_elixir/test.x/my_struct.ex @@ -30,19 +30,19 @@ defmodule MyXDR.MyStruct do field7: Bool ) - @type type_field1 :: Uint512.t() - @type type_field2 :: OptHash1.t() - @type type_field3 :: Int1.t() - @type type_field4 :: UInt.t() - @type type_field5 :: Float.t() - @type type_field6 :: DoubleFloat.t() - @type type_field7 :: Bool.t() + @type field1_type :: Uint512.t() + @type field2_type :: OptHash1.t() + @type field3_type :: Int1.t() + @type field4_type :: UInt.t() + @type field5_type :: Float.t() + @type field6_type :: DoubleFloat.t() + @type field7_type :: Bool.t() - @type t :: %__MODULE__{field1: type_field1(), field2: type_field2(), field3: type_field3(), field4: type_field4(), field5: type_field5(), field6: type_field6(), field7: type_field7()} + @type t :: %__MODULE__{field1: field1_type(), field2: field2_type(), field3: field3_type(), field4: field4_type(), field5: field5_type(), field6: field6_type(), field7: field7_type()} defstruct [:field1, :field2, :field3, :field4, :field5, :field6, :field7] - @spec new(field1 :: type_field1(), field2 :: type_field2(), field3 :: type_field3(), field4 :: type_field4(), field5 :: type_field5(), field6 :: type_field6(), field7 :: type_field7()) :: t() + @spec new(field1 :: field1_type(), field2 :: field2_type(), field3 :: field3_type(), field4 :: field4_type(), field5 :: field5_type(), field6 :: field6_type(), field7 :: field7_type()) :: t() def new( %Uint512{} = field1, %OptHash1{} = field2, diff --git a/spec/output/generator_spec_elixir/test.x/nester.ex b/spec/output/generator_spec_elixir/test.x/nester.ex index 0b12d18db..604732a7e 100644 --- a/spec/output/generator_spec_elixir/test.x/nester.ex +++ b/spec/output/generator_spec_elixir/test.x/nester.ex @@ -22,15 +22,15 @@ defmodule MyXDR.Nester do nested_union: NesterNestedUnion ) - @type type_nested_enum :: NesterNestedEnum.t() - @type type_nested_struct :: NesterNestedStruct.t() - @type type_nested_union :: NesterNestedUnion.t() + @type nested_enum_type :: NesterNestedEnum.t() + @type nested_struct_type :: NesterNestedStruct.t() + @type nested_union_type :: NesterNestedUnion.t() - @type t :: %__MODULE__{nested_enum: type_nested_enum(), nested_struct: type_nested_struct(), nested_union: type_nested_union()} + @type t :: %__MODULE__{nested_enum: nested_enum_type(), nested_struct: nested_struct_type(), nested_union: nested_union_type()} defstruct [:nested_enum, :nested_struct, :nested_union] - @spec new(nested_enum :: type_nested_enum(), nested_struct :: type_nested_struct(), nested_union :: type_nested_union()) :: t() + @spec new(nested_enum :: nested_enum_type(), nested_struct :: nested_struct_type(), nested_union :: nested_union_type()) :: t() def new( %NesterNestedEnum{} = nested_enum, %NesterNestedStruct{} = nested_struct, diff --git a/spec/output/generator_spec_elixir/test.x/nester_nested_struct.ex b/spec/output/generator_spec_elixir/test.x/nester_nested_struct.ex index c15de868e..8ecb9c3e7 100644 --- a/spec/output/generator_spec_elixir/test.x/nester_nested_struct.ex +++ b/spec/output/generator_spec_elixir/test.x/nester_nested_struct.ex @@ -18,13 +18,13 @@ defmodule MyXDR.NesterNestedStruct do blah: Int ) - @type type_blah :: Int.t() + @type blah_type :: Int.t() - @type t :: %__MODULE__{blah: type_blah()} + @type t :: %__MODULE__{blah: blah_type()} defstruct [:blah] - @spec new(blah :: type_blah()) :: t() + @spec new(blah :: blah_type()) :: t() def new( %Int{} = blah ), diff --git a/spec/output/generator_spec_elixir/union.x/int_union.ex b/spec/output/generator_spec_elixir/union.x/int_union.ex index 3de287513..eef96d507 100644 --- a/spec/output/generator_spec_elixir/union.x/int_union.ex +++ b/spec/output/generator_spec_elixir/union.x/int_union.ex @@ -25,16 +25,17 @@ defmodule MyXDR.IntUnion do Error.t() | MultiList.t() - @type t :: %__MODULE__{value: value(), type: Int.t()} + @type t :: %__MODULE__{value: value(), type: integer()} defstruct [:value, :type] - @spec new(value :: value(), type :: Int.t()) :: t() - def new(value, %Int{} = type), do: %__MODULE__{value: value, type: type} + @spec new(value :: value(), type :: integer()) :: t() + def new(value, type), do: %__MODULE__{value: value, type: type} @impl true def encode_xdr(%__MODULE__{value: value, type: type}) do type + |> Int.new() |> XDR.Union.new(@arms, value) |> XDR.Union.encode_xdr() end @@ -42,6 +43,7 @@ defmodule MyXDR.IntUnion do @impl true def encode_xdr!(%__MODULE__{value: value, type: type}) do type + |> Int.new() |> XDR.Union.new(@arms, value) |> XDR.Union.encode_xdr!() end