Перейти к основному содержимому

C#

Пакет для .NET читает тот же .tdc-конфиг и при том же сиде выдаёт тот же результат, что и реализации на TypeScript, Python, Java и Rust — байт в байт, на всех трёх движках и в Parquet.

Два пакета: библиотека и командная строка как dotnet tool.

Где взять

На NuGet — версия 0.1.7
dotnet add package Tdcv2

Стартовые паки вшиты в сборку, поэтому пакет работает без всего остального. Командная строка — собственный пакет-инструмент: ставите глобально, и tdcv2 оказывается в PATH:

dotnet tool install --global Tdcv2.Cli

Как пользоваться

using Tdcv2;

var data = new Tdc("users.tdc");
Console.WriteLine(data);

foreach (Tdc.Row row in data.Rows())
{
Console.WriteLine(row["Gender"]);
}

data.WriteFile("users.csv");

Строки, а не текст

Ради строк библиотеку и берут вместо командной строки. Тест, который проверяет row["Gender"], говорит то, что имеет в виду; тот же тест, разбирающий CSV обратно из текста, тратит на разбор большую часть своих строчек.

Текстовый вывод и построчный читают одни и те же сгенерированные значения, так что разойтись они не могут. Построчный вид полностью игнорирует <block> и текстовые обёртки — это описание формата файла, а у строки формата нет.

var data = new Tdc(new Tdc.Options
{
ConfigFile = "users.tdc",
Count = 100, // перекрывает то, что объявлено в <env>
SeedValue = "test", // фиксирует прогон
});

Tdc.Row first = data[0];
Console.WriteLine(first["Address.city"]); // поле составной последовательности
Console.WriteLine(first.Nested()["Address"]); // или весь адрес целиком

Последовательность, не относящаяся к этой строке, возвращает null, а не "". У колонки с parent="Gender.Male" на женской строке значения нет, и пустая строка утверждала бы, что значение есть — просто пустое.

Опции

ConfigFile / ConfigStringРовно одно из двух
Count, SeedValue, LocaleПерекрывают то, что объявлено в <env>
NowMillisЗафиксировать часы, чтобы тест с датой не протух за ночь
PacksDir, DataPathsГде искать паки и источники @data/…
BaseDirОтносительно чего считается относительный src=

В Diagnostics лежит всё, о чём конфиг предупредили, но за что не отказали: ошибки бросаются из конструктора, так что оставшееся стоит сказать, но не стоит того, чтобы останавливаться. SeedInfo сообщает, был ли сид сгенерирован — прогон без сида невоспроизводим, а это почти никогда не то, чего хотели.

Одно значение без конфига

Quick.Tdc вытягивает одно значение из тех же пакетов данных, которые читает конфиг: ни файла, ни <env>, один вызов.

using Tdcv2.Quick;

dynamic tdc = Quick.Tdc;

tdc.person.lastName(); // Jones
tdc.country.usa.docs.ssn(); // 699209702, с настоящими контрольными цифрами
tdc.person.lastName.many(5); // сразу пять
Quick.Seed("demo").locale("ru").person.lastName(); // закреплено и по-русски

Это единственная часть библиотеки на dynamic, и намеренно: адрес — это путь по данным, а не фиксированный набор членов, и класс на каждую папку пакета положил бы в сборку сто тысяч строк пустоты. Плата за это — опечатка в адресе ловится при выполнении, поэтому сообщение об ошибке называет ближайший настоящий адрес. Вся поверхность — на странице По одному значению.

Требования

.NET 6.0 или новее. В README для C# перечислены места, где .NET потребовал внимания, а JVM нет — переполнение, сдвиги, порядок байтов, регистр и данные локали, — каждое из которых иначе изменило бы байты.