C#
Пакет для .NET читает тот же .tdc-конфиг и при том же сиде выдаёт тот же
результат, что и реализации на TypeScript, Python, Java и Rust — байт в байт, на всех трёх
движках и в Parquet.
Два пакета: библиотека и командная строка как dotnet tool.
Где взять
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 нет — переполнение, сдвиги, порядок байтов, регистр и данные локали, — каждое из которых иначе изменило бы байты.