Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion config/config.exs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This file is responsible for configuring your application
# and its dependencies with the aid of the Mix.Config module.
use Mix.Config
import Config

# This configuration is loaded before any dependency and is restricted
# to this project. If another project depends on this project, this
Expand Down
15 changes: 11 additions & 4 deletions lib/exgencode.ex
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,8 @@ defmodule Exgencode do
field_name,
props
),
props[:version]
props[:version],
props[:type]
)

decode_fun =
Expand All @@ -426,7 +427,8 @@ defmodule Exgencode do
field_name,
props
),
props[:version]
props[:version],
props[:type]
)

{field_name, [{:encode, encode_fun}, {:decode, decode_fun} | props]}
Expand All @@ -435,11 +437,16 @@ defmodule Exgencode do
encode_fun =
Exgencode.EncodeDecode.create_versioned_encode(
Exgencode.EncodeDecode.wrap_custom_encode(field_name, props[:encode]),
props[:version]
props[:version],
props[:type]
)

decode_fun =
Exgencode.EncodeDecode.create_versioned_decode(props[:decode], props[:version])
Exgencode.EncodeDecode.create_versioned_decode(
props[:decode],
props[:version],
props[:type]
)

{field_name,
props
Expand Down
20 changes: 14 additions & 6 deletions lib/exgencode/encode_decode.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@ defmodule Exgencode.EncodeDecode do
Helper functions for generating encoding and decoding functions.
"""

def create_versioned_encode(function, nil) do
def create_versioned_encode(function, nil, :subrecord) do
quote do: fn version -> unquote(function) end
end

def create_versioned_encode(function, nil, _) do
quote do: fn _ -> unquote(function) end
end

def create_versioned_encode(function, version) do
def create_versioned_encode(function, version, _) do
quote do
fn
nil ->
Expand All @@ -23,11 +27,15 @@ defmodule Exgencode.EncodeDecode do
end
end

def create_versioned_decode(function, nil) do
def create_versioned_decode(function, nil, :subrecord) do
quote do: fn version -> unquote(function) end
end

def create_versioned_decode(function, nil, _) do
quote do: fn _ -> unquote(function) end
end

def create_versioned_decode(function, version) do
def create_versioned_decode(function, version, _) do
quote do
fn
nil ->
Expand All @@ -46,7 +54,7 @@ defmodule Exgencode.EncodeDecode do
def create_encode_fun(:subrecord, field_name, props) do
basic_fun =
quote do: fn %{unquote(field_name) => field_val} ->
<<Exgencode.Pdu.encode(field_val)::bitstring>>
<<Exgencode.Pdu.encode(field_val, version)::bitstring>>
end

wrap_conditional_encode(props, basic_fun)
Expand Down Expand Up @@ -185,7 +193,7 @@ defmodule Exgencode.EncodeDecode do
basic_fun =
quote do
fn pdu, binary ->
{field_value, rest_binary} = Exgencode.Pdu.decode(unquote(default), binary)
{field_value, rest_binary} = Exgencode.Pdu.decode(unquote(default), binary, version)
{struct!(pdu, %{unquote(field_name) => field_value}), rest_binary}
end
end
Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule Exgencode.Mixfile do
def project do
[
app: :exgencode,
version: "2.5.1",
version: "2.5.2",
elixir: "~> 1.7",
start_permanent: Mix.env() == :prod,
deps: deps(),
Expand Down
16 changes: 16 additions & 0 deletions test/exgencode_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ defmodule ExgencodeTest do
assert <<10::size(16)>> == Exgencode.Pdu.encode(pdu, "1.0.0")
assert <<10::size(16), 111::size(8)>> == Exgencode.Pdu.encode(pdu, "2.0.0")
assert <<10::size(16), 111::size(8), 14::size(8)>> == Exgencode.Pdu.encode(pdu, "2.1.0")

nested_pdu = %TestPdu.NestedVersionedMsg{nested: pdu}

assert <<2::size(16), 10::size(16), 111::size(8), 14::size(8)>> ==
Exgencode.Pdu.encode(nested_pdu)

assert <<2::size(16), 10::size(16), 111::size(8)>> ==
Exgencode.Pdu.encode(nested_pdu, "2.0.0")
end

test "versioning decode" do
Expand All @@ -76,6 +84,14 @@ defmodule ExgencodeTest do

assert {%TestPdu.VersionedMsg{}, <<111::size(8), 14::size(8)>>} =
Exgencode.Pdu.decode(%TestPdu.VersionedMsg{}, binary, "1.0.0")

nested_pdu = %TestPdu.NestedVersionedMsg{nested: %TestPdu.VersionedMsg{}}
binary = <<2::size(16), 10::size(16)>>
assert {^nested_pdu, <<>>} = Exgencode.Pdu.decode(%TestPdu.NestedVersionedMsg{}, binary, "1.0.0")

nested_pdu = %TestPdu.NestedVersionedMsg{nested: %TestPdu.VersionedMsg{newerField: 111}}
binary = <<2::size(16), 10::size(16), 111::size(8)>>
assert {^nested_pdu, <<>>} = Exgencode.Pdu.decode(%TestPdu.NestedVersionedMsg{}, binary, "2.0.0")
end

test "versioned encode/decode symmetry" do
Expand Down
4 changes: 4 additions & 0 deletions test/helpers/test_pdu.ex
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ defmodule Exgencode.TestPdu do
end
]

defpdu NestedVersionedMsg,
someField: [size: 16, default: 2],
nested: [type: :subrecord, default: %VersionedMsg{}]

defpdu EndianMsg,
bigField: [default: 15, size: 32, endianness: :big],
smallField: [default: 15, size: 32, endianness: :little]
Expand Down
Loading