Интеграция

Бэкенд 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 StudyTask {
    title: string,
    minutes: int,
    done: bool = false,
}

function parseMinutes(text: string) -> Result<int, string> {
    match toInt(text) {
        case Some(value) if value > 0 => Ok(value)
        case _ => Err("minutes must be a positive integer")
    }
}

export function makeTask(
    title: string,
    minuteText: string,
    done: bool = false,
) -> Result<StudyTask, string> {
    let minutes = parseMinutes(minuteText)?
    Ok(StudyTask { title: title, minutes: minutes, done: done })
}

export function summarize(tasks: Array<StudyTask>) -> string {
    let mut remaining = 0
    for task in tasks {
        if !task.done {
            remaining = remaining + task.minutes
        }
    }
    "tasks={tasks.length}, remaining={remaining} minutes"
}

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

TOPAZ
import src.plan { StudyTask, makeTask, summarize }

export function main(args: Array<string>, stdin: string) -> Result<int, string> {
    let tasks: Array<StudyTask> = [
        makeTask("Run first program", "10", true)?,
        makeTask("Build application", "25", false)?,
    ]
    print(summarize(tasks))
    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 на уровне исходного кода. Считайте успешный запуск свидетельством вывода и кода завершения этой программы на этой цели. Пользовательскую обёртку проверяйте по отдельному контракту кода среды.

Продолжите с границ интеграции, бэкенда Python, интерпретатора и бэкендов или артефактов и развёртывания.