
Type-driven development в Rust, часть 3/5: цепочка проверок и порядок событий в типах
Продолжаем серию о type-driven development в Rust — подходе, при котором правила предметной области выражаются в типах, а код, нарушающий эти правила, не компилируется. Рассказывает Никита Тимофеенко, разработчик команды MXDR компании F6.Во второй части типы описывали контракты между компонентами: заявка уходила на площадку через трейт, а типы результата выбирала реализация. Третья часть переходит на сторону биржи. Заявка пришла, и перед стаканом её ждёт цепочка проверок: статус инструмента, коридор цены, лимит по номиналу, лимит позиции. Состав этой цепочки известен ещё при сборке, и третья часть — о том, как записать его в тип, чтобы шлюз без обязательной проверки не компилировался, а непроверенная заявка не доходила до стакана.После неё вы сможете собрать список типов и прогнать по нему одну операцию, не перечисляя элементы руками; записать утверждение о таком списке трейтом, чтобы забытый элемент был ошибкой сборки, а не инцидентом; превратить факт проверки в отдельный тип, который принимают только те функции, которым эта проверка нужна; перечислить допустимые переходы состояния impl-ами, чтобы недопустимое событие не попадало в журнал. Читать далее