From 3bfe8b965e9be74d48a97b877b864d92990ba4fa Mon Sep 17 00:00:00 2001 From: Chris Keathley Date: Sun, 7 Jun 2026 13:32:09 -0400 Subject: [PATCH] Fix type errors. Raise argument error if from_string fails --- .tool-versions | 4 ++-- lib/hlclock/timestamp.ex | 44 ++++++++++++++++++++++++++++++++------ test/support/generators.ex | 2 +- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/.tool-versions b/.tool-versions index b4fc3c7..6ede9b2 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -erlang 27.3.4.6 -elixir 1.19.5-otp-27 +erlang 28.4.3 +elixir 1.20.0-otp-28 diff --git a/lib/hlclock/timestamp.ex b/lib/hlclock/timestamp.ex index a88365d..bb823e4 100644 --- a/lib/hlclock/timestamp.ex +++ b/lib/hlclock/timestamp.ex @@ -151,13 +151,43 @@ defmodule HLClock.Timestamp do Recover a Timestamp from the string representation. """ def from_string(tstr) do - with {:ok, dt, _} <- tstr |> String.slice(0, 24) |> DateTime.from_iso8601(), - time when is_integer(time) <- DateTime.to_unix(dt, :millisecond), - {counter, _} <- tstr |> String.slice(25, 4) |> Integer.parse(16), - {node, _} <- tstr |> String.slice(30, 16) |> Integer.parse(16), - {:ok, timestamp} <- new(time, counter, node) do - timestamp - end + time = + tstr + |> String.slice(0, 24) + |> DateTime.from_iso8601() + |> case do + {:ok, dt, _} -> + DateTime.to_unix(dt, :millisecond) + + _ -> + raise ArgumentError, "invalid timestamp string #{tstr}" + end + + counter = + tstr + |> String.slice(25, 4) + |> Integer.parse(16) + |> case do + {counter, _} -> + counter + + :error -> + raise ArgumentError, "invalid timestamp string #{tstr}" + end + + node = + tstr + |> String.slice(30, 16) + |> Integer.parse(16) + |> case do + {node, _} -> + node + + :error -> + raise ArgumentError, "invalid timestamp string #{tstr}" + end + + new(time, counter, node) end defp compare_node_ids(local_id, remote_id) when local_id == remote_id, diff --git a/test/support/generators.ex b/test/support/generators.ex index ec746eb..4b91335 100644 --- a/test/support/generators.ex +++ b/test/support/generators.ex @@ -13,7 +13,7 @@ defmodule HLClock.Generators do def ntp_millis, do: integer(0..@max_time_size) def int_of_size(size) do - bind(bitstring(length: size), fn <> -> + bind(bitstring(length: size), fn <> -> constant(n) end) end