Входные настройки - работай как профи! | Метод расширения ILocalVariable

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
733
Благодарностей
485
Баллы
63
Всем привет! С вами Дмитрий!
В данном кейсе я расскажу, как можно быстро и удобно работать с Входными настройками, используя C#.

Вдохновлялся я данной статьей: Нестандартные подходы к разработке шаблонов.
В статье очень хорошо описывается, как, используя "Метод расширения" добавлять нужный нам функционал к уже имеющемуся в ZennoPoster. Тем самым мы можем значительно упростить однообразную работу при написание шаблонов.

Если мы посмотрим документацию по работе с "Входными настройками" ILocalVariable, то для работы мы видим 4 свойства, из которых мы работаем только с одним Value, который возвращает данные из переменных ZennoPoster с типом данных string. А для работы нам часто нужны и другие типы данных, например, int или bool. Поэтому постоянно приходится в коде преобразовывать данные из входных настроек в нужный тип данных. А что, если мы, используя метод расширения, дополним наш интерфейс ILocalVariable своими методами, которые будут преобразовывать в нужный тип данных, а еще проверять это преобразование? Будет очень удобно! :bo:

Представляю вашему вниманию сниппет для работы с "Входными настройками"
Ссылка на Git
C#:
public static class LocalVariableExt
{
    private static readonly Random _random = new Random();

    /// <summary>
    /// Преобразует значение string в целочисленное значение (int).
    /// Выбрасывает FormatException, если преобразование не удалось.
    /// </summary>
    /// <returns>Целочисленное значение (int).</returns>
    public static int ToInt(this string value)
    {
        return int.TryParse(value, out int result) ? result :
        throw new FormatException($"Значение переменной \"{value}\" не может быть преобразовано в тип данных Int.");
    }

    /// <summary>
    /// Преобразует значение локальной переменной в целочисленное значение (int).
    /// Выбрасывает FormatException, если преобразование не удалось.
    /// </summary>
    /// <returns>Целочисленное значение преобразованной переменной (int).</returns>
    public static int ToInt(this ILocalVariable variable)
    {
        return int.TryParse(variable.Value, out int result) ? result :
        throw new FormatException($"Значение переменной \"{variable.Name}\" не может быть преобразовано в тип данных Int.");
    }

    /// <summary>
    /// Преобразует значение локальной переменной в логическое значение (bool).
    /// Выбрасывает FormatException, если преобразование не удалось.
    /// </summary>
    /// <returns>Логическое значение преобразованной переменной (bool).</returns>
    public static bool ToBool(this ILocalVariable variable)
    {
        if (!bool.TryParse(variable.Value, out bool result))
        {
            throw new FormatException($"Значение переменной \"{variable.Name}\" не может быть преобразовано в тип данных Bool.");
        }
        return result;
    }

    /// <summary>
    /// Преобразует значение переменной с разделителями в массив строк.
    /// </summary>
    /// <param name="separator">Разделитель для разбиения строки (по умолчанию ',').</param>
    /// <returns>Строковый массив значений после разделения.</returns>
    public static string[] MultiSelectToArray(this ILocalVariable variable, char separator = ',')
    {
        var value = variable.Value;

        if (value.Contains(separator))
        {
            return value.Split(separator)
                .Select(s => s.Trim())
                .ToArray();
        }
        else return new string[] { value.Trim() };
    }

    /// <summary>
    /// Считывает значения из файла, каждую строку файла преобразует в элемент списка.
    /// </summary>
    /// <returns>Список строк, прочитанных из файла.</returns>
    public static List<string> ToList(this ILocalVariable variable)
    {
        return File.ReadAllLines(variable.Value).ToList();
    }

    /// <summary>
    /// Получает случайное целочисленное значение из заданного диапазона значений переменной либо из максимального значения.
    /// Выбрасывает FormatException, если значение переменной не соответствует формату диапазона.
    /// </summary>
    /// <returns>Случайное целое число в заданном диапазоне или из максимального значения (int).</returns>
    public static int GetRandomInt(this ILocalVariable variable)
    {
        var values = variable.Value;

        if (values.Contains("-"))
        {
            var parts = values.Split('-');
            if (parts.Length == 2 && int.TryParse(parts[0], out var minValue) && int.TryParse(parts[1], out var maxValue))
            {
                return _random.Next(minValue, maxValue + 1);
            }
            else
            {
                throw new FormatException($"Некорректный формат диапазона переменной \"{variable.Name}\"");
            }
        }
        else return _random.Next(variable.ToInt());
    }

    /// <summary>
    /// Обрабатывает текст с использованием спинтаксиса для создания различных комбинаций.
    /// </summary>
    /// <returns>Текст после обработки спинтаксиса.</returns>
    public static string Spintax(this ILocalVariable variable)
    {
        return TextProcessing.Spintax(variable.Value);
    }

    /// <summary>
    /// Проверяет значение переменной на наличие данных, выбрасывает исключение, если значение пустое.
    /// </summary>
    /// <param name="exceptionMessage">Сообщение исключения, если значение пустое (не обязательно).</param>
    /// <returns>Тот же экземпляр для цепочки вызовов.</returns>
    public static ILocalVariable ExceptionEmpty(this ILocalVariable variable, string exceptionMessage = null)
    {
        if (string.IsNullOrWhiteSpace(variable.Value))
        {
            throw new Exception(exceptionMessage ?? $"Переменная \"{variable.Name}\" не имеет данных.");
        }
        return variable;
    }

    /// <summary>
    /// Проверяет существование файла и его содержимое.
    /// Выбрасывает исключение, если файл не найден или пустой в зависимости от параметра ExceptionIfEmpty.
    /// </summary>
    /// <param name="ExceptionIfEmpty">Проверка на пустой файл.</param>
    /// <returns>Тот же экземпляр для цепочки вызовов.</returns>
    public static ILocalVariable ExceptionFile(this ILocalVariable variable, bool ExceptionIfEmpty = true)
    {
        string message;
        var value = variable.Value;
        if (!File.Exists(value))
        {
            message = string.Format("Файл \"{0}\" не найден", value);
            throw new Exception(message);
        }

        if(ExceptionIfEmpty && new FileInfo(value).Length == 0)
        {
            message = string.Format("Файл \"{0}\" пустой", value);
            throw new Exception(message);
        }

        return variable;
    }

    /// <summary>
    /// Проверяет существование директории и её содержимое.
    /// Выбрасывает исключение, если директория не найдена или пустая в зависимости от параметра ExceptionIfEmpty.
    /// </summary>
    /// <param name="ExceptionIfEmpty">Проверка на пустую директорию.</param>
    /// <returns>Тот же экземпляр для цепочки вызовов.</returns>
    public static ILocalVariable ExceptionDirectory(this ILocalVariable variable, bool ExceptionIfEmpty = true)
    {
        string message;
        var value = variable.Value;
        if (!Directory.Exists(value))
        {
            message = string.Format("Директория \"{0}\" не найден", value);
            throw new Exception(message);
        }

        if (ExceptionIfEmpty && !Directory.EnumerateFileSystemEntries(value).Any())
        {
            message = string.Format("Директория \"{0}\" пустая", value);
            throw new Exception(message);
        }

        return variable;
    }
}

Как его установить.
1 этап, копируем код и вставляем в "Общий код"
121016


Вот так:
121017


Код уже работает, мы можем использовать его в своем шаблоне. Но постоянно его копировать не хочется! Поэтому переходим к ...

2 этап, сохраняем сниппет для удобной загрузки в других шаблонах.

Нажимаем плюсик, чтобы свернуть код, выделяем строку, правой кнопкой мыши вызываем меню и сохраняем в C# сниппет.
121018



Теперь, если нам нужно быстро добавить данный сниппет в наш новый шаблон, выполняем первый этап, только вместо копировать вставить, правой кнопкой мыши вызываем меню и добавляем наш сниппет. Все готово, можно работать.

121019

Описание методов.
Метод ToInt() преобразовывает тип данных string в тип данных int.
Пример: из "2" получаем 2
C#:
//Пример 1
int numb = project.Variables["numb"].ToInt();

//Пример 2
string value = "2";
int numb = value.ToInt();
Метод ToBool() преобразовывает тип данных string в тип данных bool.
Пример: из "True" получаем true
C#:
//Пример 1
bool isNull = project.Variables["null"].ToBool();
Метод MultiSelectToArray(char separator = ',') преобразовывает тип данных string в тип данных string[], по умолчанию разделяя через ',' но можно выставить свой разделитель. Данный метод предназначен для удобной работы с Входными настройками типом DropDownMultiSelect. Мы сразу же получаем массив данных, чтобы в дальнейшем с ними работать.
Пример: из данных переменной Array{item1|item2|item3} получаем массив item.
C#:
//Пример 1
string[] arrItem= project.Variables["items"].MultiSelectToArray();
Метод ToList() берет путь до файла из Входных настроек и получает из файла список строк. Важно! Проверок в методе нет, нужно самостоятельно контролировать путь к файлу.
C#:
//Пример 1
List<string>lstAccount = project.Variables["pathFile"].ToList();
Метод GetRandomInt() получает случайное число из диапазона значений.
Пример: в переменной значение "1-100" получаем рандом 56 или в переменной одно число "100" получаем рандом 47.
C#:
//Пример 1
int random = project.Variables["range"].GetRandomInt();
Метод Spintax() обрабатывает текст с использованием спинтаксиса для создания различных комбинаций. Важно! Проверок в методе нет, нужно самостоятельно контролировать данные.
Пример: в переменной значение "{item1|item2|item3|item4|item5|item6}" получаем рандом item3
C#:
//Пример 1
string item = project.Variables["items"].Spintax();
Группа методов для проверки значений переменных.

Метод ExceptionEmpty() проверяет значение переменной на наличие данных, выбрасывает исключение, если значение пустое. Есть аргумент exceptionMessage, где мы можем прописать свое сообщение при исключение. Если оставить пустым — будет выбрасывать исключение: $"Переменная \"{variable.Name}\" не имеет данных."

Пример: если для нас важно, чтобы во Входных настройках переменная имела значение, прописываем ее проверку, если переменная будет пустая — шаблон выкинет исключение и остановит работу.
C#:
//Пример 1
project.Variables["value"].ExceptionEmpty();
//Пример 2
project.Variables["value2"].ExceptionEmpty("Свой текст ошибки");
Метод ExceptionFile(bool ExceptionIfEmpty = true) проверяет существование файла и его содержимое. Аргумент ExceptionIfEmpty отвечает за проверку пустого файла, по умолчанию True, если надо отключить — ставим False.
Пример: Нам нужно проверить, что по указанному пути есть файл и он не пустой, иначе выкинем исключение и остановим работу.
C#:
//Пример 1
project.Variables["pathFile"].ExceptionFile();
Метод ExceptionDirectory(bool ExceptionIfEmpty = true) проверяет существование директории и файлы внутри нее. Аргумент ExceptionIfEmpty отвечает за проверку пустого директории, по умолчанию True, если надо отключить — ставим False.
Пример: нам нужно проверить, что по указанному пути есть директория и она не пустая, иначе выкинем исключение и остановим работу.
C#:
//Пример 1
project.Variables["pathDir"].ExceptionDirectory();



#####################
Мой Телеграм Канал
Мой Youtube Канал
Личный блог на Форуме

Поддержка автора: Донат
#####################
 
Последнее редактирование:

demiddima

Client
Регистрация
06.06.2023
Сообщения
30
Благодарностей
69
Баллы
18
Ля, узнал как сниппеты работают:-) А я просто ctrl+c ctrl+v делал всё это время
 
  • Спасибо
Реакции: Dmitriy Ka

DeepFarm

Seller
Регистрация
11.05.2023
Сообщения
117
Благодарностей
24
Баллы
18
Не очень понятно, в чем преимущество работы в отличии от стандартных входнях настроек?
 

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
733
Благодарностей
485
Баллы
63
Не очень понятно, в чем преимущество работы в отличии от стандартных входнях настроек?
Скорость работы, вам не нужно каждый раз прописывать код, чтобы преобразовать тип данных, достаточно вызвать метод.

C#:
//Вот так выглядит код для конверта в int
//Нам каждый раз нужно писать Convert.ToInt32()
var numb = Convert.ToInt32(project.Variables["numb"].Value);

//Вот так выглядит мое расширение
//Мы просто вызываем метод .ToInt(); и все готово
var numb = project.Variables["numb"].ToInt();
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 261
Благодарностей
679
Баллы
113
Круто, про методы расширения знал, но чет даже мыслей не было стандартные зенковские интерфейсы расширять
 
  • Спасибо
Реакции: Dmitriy Ka

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)