Интеграция

Бэкенд Rust

Соберите проверенный пакет Топаза в управляемый платформенный продукт и запустите его без дерева исходного кода Топаза.

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

Предварительные требования

  • Завершите пакет study-plan из раздела Первое приложение.
  • Храните вместе topaz.toml, topaz.lock, src/plan.tpz, src/main.tpz и выбранный тест.
  • Установите на машине сборки совместимый инструментарий Rust с Cargo.
  • Выполняйте следующие команды из каталога study-plan.

Готовому файлу не нужны Топаз, Cargo или файлы .tpz во время исполнения. Однако он предназначен для ОС и архитектуры, под которые был собран.

Общий проверяемый пакет

На странице Python используются те же два модуля Топаза. Сначала src/plan.tpz:

TOPAZ
export record УчебнаяЗадача {
    название: string,
    минуты: int,
    выполнена: bool = false,
}

function разобратьМинуты(текст: string) -> Result<int, string> {
    match toInt(текст) {
        case Some(значение) if значение > 0 => Ok(значение)
        case _ => Err("minutes must be a positive integer")
    }
}

export function создатьЗадачу(
    название: string,
    текстМинут: string,
    выполнена: bool = false,
) -> Result<УчебнаяЗадача, string> {
    let минуты = разобратьМинуты(текстМинут)?
    Ok(УчебнаяЗадача { название: название, минуты: минуты, выполнена: выполнена })
}

export function подвестиИтог(задачи: Array<УчебнаяЗадача>) -> string {
    let mut осталось = 0
    for задача in задачи {
        if !задача.выполнена {
            осталось = осталось + задача.минуты
        }
    }
    "tasks={задачи.length}, remaining={осталось} minutes"
}

Точка входа пакета src/main.tpz:

TOPAZ
import src.plan { УчебнаяЗадача, создатьЗадачу, подвестиИтог }

export function main(аргументы: Array<string>, ввод: string) -> Result<int, string> {
    let задачи: Array<УчебнаяЗадача> = [
        создатьЗадачу("Run first program", "10", true)?,
        создатьЗадачу("Build application", "25", false)?,
    ]
    print(подвестиИтог(задачи))
    Ok(0)
}

Проверьте исходный код Топаза

Проверьте пакет, выполните выбранный тест и зафиксируйте эталонный вывод:

BASH
topaz check --root . --locked
topaz test tests/plan.tpz --root . --locked
topaz run --root . --locked

Тест сообщает tests/plan.tpz: test-ok, а запуск выводит:

Вывод
tasks=2, remaining=25 minutes

emit для изучения, build для поставки

Используйте emit, только если нужно изучить или интегрировать созданный набор исходного кода Cargo:

BASH
topaz emit --target rust --root . --locked --out-dir ../dist/rust-source

Управляемый платформенный продукт создаётся командой build:

BASH
topaz build --target native --root . --locked --out-dir ../dist/native

build --target rust — неверная команда. rust обозначает цель emit, а native — поставляемую цель build.

Проверьте управляемый продукт

Обычная отладочная сборка содержит:

Вывод
dist/native/
├── GENERATED-OUTPUT-NOTICE.txt
├── LICENSE
├── NOTICE
├── target
│   └── debug
│       └── program[.exe]
└── topaz-artifact.json

topaz-artifact.json записывает цель native, требуемые ОС и архитектуру, команду запуска, размер и SHA-256 каждого управляемого файла. Топаз записывает манифест последним и отклоняет изменённый файл, небезопасную коллизию или другую цель в том же каталоге.

Запустите без доступного исходного кода Топаза

Каталог dist находится вне пакета, поэтому переместите исходный пакет и запустите только продукт:

BASH
cd ..
mv study-plan source-unavailable
./dist/native/target/debug/program

В Windows используйте Rename-Item study-plan source-unavailable, затем запустите .\dist\native\target\debug\program.exe. Продукт завершается с кодом 0 и печатает тот же результат.

Восстановление с учётом цели

  • Если Cargo отсутствует или несовместим, исправьте машину сборки и повторите команду.
  • --release создаёт target/release/program[.exe] и меняет профиль сборки, а не семантику Топаза.
  • По умолчанию используется универсальная среда Rust. Необязательный --backend native специализирует доказанные участки, а остальные сохраняет в универсальном представлении.
  • Нельзя копировать платформенный исполняемый файл на другую ОС или архитектуру и считать это поддерживаемой поставкой.

Точная граница

Созданный Rust и его среда выполнения — заменяемые артефакты, а не API для ручного расширения или FFI на уровне исходного кода. Считайте успешный запуск свидетельством вывода и кода завершения этой программы на этой цели. Пользовательскую обёртку проверяйте по отдельному контракту кода среды.

Если пакет связывает ограниченные правила Lispex, перед сборкой следуйте руководству Ограниченное приложение решений Lispex. Этот профиль приложения несут только допущенные нативные цели; неподдерживаемый маршрут завершается ошибкой до записи артефакта. Продолжите с границ интеграции, бэкенда Python, интерпретатора и бэкендов или артефактов и развёртывания.