Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Configurator — конфигуратор дизель-генераторов

Типизированный конфигуратор с ленивым каталогом, изолированными правилами и чистым функциональным ядром.

Принципы архитектуры

  • Чистое ядро в lib/. Никаких print, read, exit, Sys.argv. Всё — значения и Result/Seq.
  • Side effects — только в bin/main.ml. Граница программы.
  • Одно линейное место — lib/params.ml. Добавление параметра затрагивает только этот файл.
  • Правила изолированы. Один файл на правило + одна строка в реестре.
  • Ленивый каталог. Seq.t, декартово произведение строится по требованию.
  • Типизированные запросы. GADT query ловит несовпадение ключа и предиката на этапе компиляции.
  • Правила возвращают Valid | Skip | Invalid. Задел под зависимости между правилами.

Структура

lib/
  params.ml              — типы, ключи, реестр (единственное линейное место)
  product.ml             — продукт как field list
  query.ml               — типизированный фильтр
  context.ml             — расширяемый контекст (регион, заказчик, ...)
  rule.ml                — интерфейс правила
  rule_*.ml              — конкретные правила (по файлу на правило)
  rule_registry.ml       — список правил
  validate.ml            — запуск правил
  catalog.ml             — ленивое декартово произведение + фильтр
  parser.ml              — строка → типизированный запрос
  search.ml              — поиск: Nothing | Exactly_one | Many
bin/
  main.ml                — единственное место с эффектами
test/
  test_configurator.ml

Сборка

dune build
dune runtest

Использование

# список всех значений параметров
dune exec ./bin/main.exe -- --list-values

# точная комбинация
dune exec ./bin/main.exe -- 250 e3 diesel single n/a

# только мощность — все подходящие
dune exec ./bin/main.exe -- 250

# невалидная комбинация (класс 3 + бак DEF) → ничего не найдено
dune exec ./bin/main.exe -- e3 inside

# весь каталог
dune exec ./bin/main.exe --

Формат запроса

Токены, разделённые пробелом. Каждый токен — значение одного из параметров. Порядок не важен. Пустой запрос = весь каталог.

Доступные параметры

Параметр Значения
power 250 400 560
emission e3 e5
fuel diesel gas
phase single three
def_location inside outside n/a

Как расширять

Добавить параметр

  1. Открыть lib/params.ml.
  2. Добавить модуль параметра (тип, name, all, to_string, of_string, equal).
  3. Добавить конструктор в GADT key.
  4. Добавить ветку в get и set (в match k, k' with).
  5. Добавить строку в all_keys и registry.

Больше ничего трогать не нужно. product.ml, query.ml, parser.ml, catalog.ml, validate.ml, search.ml, bin/main.ml не меняются.

Добавить правило

  1. Создать lib/rule_<имя>.ml с name и check : Context.t -> Product.t -> Rule.outcome.
  2. Добавить одну строку в lib/rule_registry.ml.

Границы текущей архитектуры

  • params.ml растёт линейно (~15 строк на параметр). Для 15–20 параметров приемлемо; для большего — ppx.
  • Каталог строится полностью и потом фильтруется. Для очень широких доменов это может стать проблемой; решение — объявить в Rule.S val restricts : Params.any_key list и отсекать раньше.
  • Правила проверяются в порядке реестра. Если понадобится приоритет — расширить Rule.outcome.

Лицензия

MIT (или ваша).

About

A typed configurator with a lazy catalog, isolated rules, and a pure functional core.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages