Skip to content

Commit 475af88

Browse files
committed
use options for uuid type
1 parent c3977d3 commit 475af88

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

lib/ecto/uuid.ex

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ defmodule Ecto.UUID do
3434
supported versions are `:v4` and `:v7`.
3535
"""
3636
@type version :: :v4 | :v7
37+
@type options :: Keyword.t()
3738

3839
@doc false
3940
def type, do: :uuid
@@ -205,30 +206,39 @@ defmodule Ecto.UUID do
205206
end
206207
end
207208

208-
@default_version :v4
209+
@default_version 4
210+
@default_options version: 4
209211
@doc """
210212
Generates a uuid of the given version
211213
"""
212214
@spec generate() :: t
213-
@spec generate(version) :: t
214-
def generate(version \\ @default_version), do: encode(bingenerate(version))
215+
@spec generate(options) :: t
216+
def generate(opts \\ [@default_options]), do: encode(bingenerate(opts))
215217

216218
@doc """
217219
Generates a v4 uuid in binary format.
218220
"""
219221
@spec bingenerate() :: raw
220-
def bingenerate(), do: bingenerate(@default_version)
222+
def bingenerate(), do: bingenerate(@default_options)
221223

222224
@doc """
223225
Generates a uuid of the given version in the binary format.
224226
"""
225-
@spec bingenerate(version) :: raw
226-
def bingenerate(:v4) do
227+
@spec bingenerate(options) :: raw
228+
def bingenerate(opts) do
229+
case Keyword.get(opts, :version, @default_version) do
230+
4 -> bingenerate_v4()
231+
7 -> bingenerate_v7()
232+
_ -> raise ArgumentError, "unknown UUID version: #{inspect(opts[:version])}"
233+
end
234+
end
235+
236+
defp bingenerate_v4 do
227237
<<u0::48, _::4, u1::12, _::2, u2::62>> = :crypto.strong_rand_bytes(16)
228238
<<u0::48, 4::4, u1::12, 2::2, u2::62>>
229239
end
230240

231-
def bingenerate(:v7) do
241+
defp bingenerate_v7 do
232242
milliseconds = System.system_time(:millisecond)
233243
<<u0::12, u1::62, _::6>> = :crypto.strong_rand_bytes(10)
234244

@@ -237,7 +247,8 @@ defmodule Ecto.UUID do
237247

238248
# Callback invoked by autogenerate fields.
239249
@doc false
240-
def autogenerate, do: generate()
250+
def autogenerate, do: generate(@default_options)
251+
def autogenerate(opts), do: generate(opts)
241252

242253
@spec encode(raw) :: t
243254
defp encode(

test/ecto/uuid_test.exs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,19 @@ defmodule Ecto.UUIDTest do
6666
end
6767

6868
test "generate v4 returns valid uuid_v4" do
69-
assert <<_::64, ?-, _::32, ?-, ?4, _::24, ?-, _::32, ?-, _::96>> = Ecto.UUID.generate(:v4)
69+
assert <<_::64, ?-, _::32, ?-, ?4, _::24, ?-, _::32, ?-, _::96>> =
70+
Ecto.UUID.generate(version: 4)
7071
end
7172

7273
test "generate v7 returns valid uuid_v7" do
73-
assert <<_::64, ?-, _::32, ?-, ?7, _::24, ?-, _::32, ?-, _::96>> = Ecto.UUID.generate(:v7)
74+
assert <<_::64, ?-, _::32, ?-, ?7, _::24, ?-, _::32, ?-, _::96>> =
75+
Ecto.UUID.generate(version: 7)
7476
end
7577

7678
test "generate v7 maintains time-based sortability across milliseconds" do
77-
uuid1 = Ecto.UUID.generate(:v7)
79+
uuid1 = Ecto.UUID.generate(version: 7)
7880
Process.sleep(1)
79-
uuid2 = Ecto.UUID.generate(:v7)
81+
uuid2 = Ecto.UUID.generate(version: 7)
8082
assert uuid1 < uuid2
8183
end
8284
end

0 commit comments

Comments
 (0)