@@ -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 (
0 commit comments