|
| 1 | +defmodule InterpolationApp.CLI.ConfigParser do |
| 2 | + @moduledoc """ |
| 3 | + Parses args for interpolation-app CLI |
| 4 | + """ |
| 5 | + |
| 6 | + @methods ["linear", "lagrange2", "lagrange3", "newton"] |
| 7 | + |
| 8 | + def parse_args(args) do |
| 9 | + args |
| 10 | + |> Enum.reduce(%{}, &parse_arg/2) |
| 11 | + |> validate_args() |
| 12 | + end |
| 13 | + |
| 14 | + defp parse_arg("--method1=" <> method, acc) do |
| 15 | + Map.put(acc, :method1, String.trim(method)) |
| 16 | + end |
| 17 | + |
| 18 | + defp parse_arg("--method2=" <> method, acc) do |
| 19 | + Map.put(acc, :method2, String.trim(method)) |
| 20 | + end |
| 21 | + |
| 22 | + defp parse_arg("--step=" <> step, acc) do |
| 23 | + Map.put(acc, :step, String.trim(step)) |
| 24 | + end |
| 25 | + |
| 26 | + defp parse_arg("--accuracy=" <> accuracy, acc) do |
| 27 | + Map.put(acc, :accuracy, String.trim(accuracy)) |
| 28 | + end |
| 29 | + |
| 30 | + defp parse_arg(_, acc), do: acc |
| 31 | + |
| 32 | + defp validate_args(%{method1: method1, method2: method2, step: step, accuracy: accuracy}) do |
| 33 | + cond do |
| 34 | + !valid_method?(method1) -> |
| 35 | + {:error, |
| 36 | + "Неправильный method1: #{method1}. Должен быть один из [#{Enum.join(@methods, ", ")}]."} |
| 37 | + |
| 38 | + !valid_method?(method2) -> |
| 39 | + {:error, |
| 40 | + "Неправильный method2: #{method2}. Должен быть один из [#{Enum.join(@methods, ", ")}]."} |
| 41 | + |
| 42 | + !valid_step?(step) -> |
| 43 | + {:error, |
| 44 | + "Неправильный step: #{step}. Должен быть положительным числом (например: 0.1, 1, 10, ...)."} |
| 45 | + |
| 46 | + !valid_accuracy?(accuracy) -> |
| 47 | + {:error, "Неправильный accuracy: #{accuracy}. Должен быть положительным целым числом."} |
| 48 | + |
| 49 | + true -> |
| 50 | + {:ok, |
| 51 | + %{ |
| 52 | + method1: module_from_method(method1), |
| 53 | + method2: module_from_method(method2), |
| 54 | + step: elem(Float.parse(step), 0), |
| 55 | + accuracy: elem(Integer.parse(accuracy), 0) |
| 56 | + }} |
| 57 | + end |
| 58 | + end |
| 59 | + |
| 60 | + defp validate_args(%{method1: method1, method2: method2, step: step}) do |
| 61 | + validate_args(%{method1: method1, method2: method2, step: step, accuracy: "3"}) |
| 62 | + end |
| 63 | + |
| 64 | + defp validate_args(_) do |
| 65 | + {:error, "Ошибка! Обязательные аргументы: --method1=, --method2=, --step="} |
| 66 | + end |
| 67 | + |
| 68 | + defp valid_method?(method), do: method in @methods |
| 69 | + |
| 70 | + defp valid_step?(step) do |
| 71 | + case Float.parse(step) do |
| 72 | + {value, ""} -> value > 0 |
| 73 | + _ -> false |
| 74 | + end |
| 75 | + end |
| 76 | + |
| 77 | + defp valid_accuracy?(accuracy) do |
| 78 | + case Integer.parse(accuracy) do |
| 79 | + {value, ""} -> value > 0 |
| 80 | + _ -> false |
| 81 | + end |
| 82 | + end |
| 83 | + |
| 84 | + defp module_from_method(method) do |
| 85 | + Module.concat(["InterpolationApp", "Algo", "#{String.capitalize(method)}Interpolation"]) |
| 86 | + end |
| 87 | +end |
0 commit comments