Packages

L42fu Lab42FileUtils creates shell commands for advanced file manipulation

Current section

Files

Jump to
l42fu lib l42fu options.ex
Raw

lib/l42fu/options.ex

defmodule L42fu.Options do
@moduledoc false
import L42fu.Tools, only: [format_number: 3]
def normalize(pfx_sfx_string, pfx_or_sfx \\ :prefix) do
case String.split(pfx_sfx_string, ":") do
[basic] -> basic
["incr", init] -> _make_increment(init, "1")
["incr", init, step] -> _make_increment(init, step)
["rand", infix | rest] -> _make_rand(rest, {infix, pfx_or_sfx})
_ -> raise ArgumentError, "not a fixed string or correct generator expression"
end
end
defp _force_integer!(value, name, base \\ 10) do
case Integer.parse(value, base) do
{ival, ""} -> ival
_ -> raise ArgumentError, "#{value} of #{name} is not an Integer"
end
end
defp _make_increment(init, step) do
init1 = _force_integer!(init, "init")
step1 = _force_integer!(step, "step")
Stream.iterate(init1, &(&1 + step1))
end
defp _make_rand(values, infix)
defp _make_rand([], infix), do: _make_rand(["0", "ffffffff", "x"], infix)
defp _make_rand([upper], infix), do: _make_rand(["0", upper, "x"], infix)
defp _make_rand([lower, upper], infix), do: _make_rand([lower, upper, "x"], infix)
defp _make_rand([lower, upper, format], infix) do
base =
case format do
"x" ->
16
"d" ->
10
"o" ->
8
"b" ->
2
x ->
raise ArgumentError,
"illegal base: #{inspect(x)}, legal values are #{inspect(~W[x d o b])}"
end
len = String.length(upper)
lower1 = _force_integer!(lower, "lower", base)
upper1 = _force_integer!(upper, "upper", base)
Stream.iterate(_random(lower1, upper1, infix, base, len), fn _ ->
_random(lower1, upper1, infix, base, len)
end)
end
defp _random(lower, upper, infx, base, len)
defp _random(lower, upper, {infx, :prefix}, base, len) do
formatted =
format_number(
lower + :rand.uniform(upper - lower + 1) - 1,
base,
len
)
"#{formatted}#{infx}"
end
defp _random(lower, upper, {infx, :suffix}, base, len) do
formatted =
format_number(
lower + :rand.uniform(upper - lower + 1) - 1,
base,
len
)
"#{infx}#{formatted}"
end
end
# SPDX-License-Identifier: Apache-2.0