From cf335c9fa3d9ac466a1d6944b84a123b0076c525 Mon Sep 17 00:00:00 2001 From: Robin van der Vleuten Date: Wed, 20 Mar 2024 16:56:29 +0100 Subject: [PATCH] Return telegram struct directly from parser --- lib/dsmr.ex | 4 ++-- lib/dsmr/parser.ex | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/dsmr.ex b/lib/dsmr.ex index f11762c..1607856 100644 --- a/lib/dsmr.ex +++ b/lib/dsmr.ex @@ -63,8 +63,8 @@ defmodule DSMR do defp do_parse(string, options) do try do case Parser.parse(string, options) do - {:ok, header, data, checksum} -> - {:ok, %Telegram{header: header, data: data, checksum: checksum}} + {:ok, _telegram} = result -> + result {:error, reason, rest} -> {:error, format_parse_error({:parser, reason, rest})} diff --git a/lib/dsmr/parser.ex b/lib/dsmr/parser.ex index 590ac58..925598d 100644 --- a/lib/dsmr/parser.ex +++ b/lib/dsmr/parser.ex @@ -3,7 +3,7 @@ defmodule DSMR.Parser do import NimbleParsec - alias DSMR.{Measurement, Timestamp} + alias DSMR.{Measurement, Telegram, Timestamp} eol = ascii_char([?\r]) |> ascii_char([?\n]) @@ -102,21 +102,24 @@ defmodule DSMR.Parser do |> ignore(eol) @spec parse(binary(), keyword()) :: - {:ok, binary(), [any()], binary()} - | {:error, binary(), {integer(), non_neg_integer()}} - def parse(input, options \\ []) do + {:ok, Telegram.t()} | {:error, binary(), binary()} + def parse(input, options) do tokenize_opts = [context: %{floats: Keyword.get(options, :floats, :native)}] case do_parse(input, tokenize_opts) do {:ok, tokens, "", _, _, _} -> [{:header, header}, {:objects, data}, {:footer, checksum}] = tokens - {:ok, header, data, checksum} + {:ok, %Telegram{header: header, data: data, checksum: checksum}} {:error, reason, rest, _, _, _} -> {:error, reason, rest} end end + @spec do_parse(binary()) :: + {:ok, [any()], binary(), map(), {pos_integer(), pos_integer()}, pos_integer()} + | {:error, String.t(), String.t(), map(), {non_neg_integer(), non_neg_integer()}, + non_neg_integer()} defparsecp(:do_parse, telegram, inline: true) defp object_token(rest, [value, {:obis, obis}], context, _line, _offset) do