Выбирайте путь Rust, когда нужен один платформенный исполняемый файл для операционной системы и архитектуры машины сборки. Rust остаётся целью сборки, а его конструкции не становятся синтаксисом Топаза.
Предварительные требования
- Завершите пакет
study-planиз раздела Первое приложение. - Храните вместе
topaz.toml,topaz.lock,src/plan.tpz,src/main.tpzи выбранный тест. - Установите на машине сборки совместимый инструментарий Rust с Cargo.
- Выполняйте следующие команды из каталога
study-plan.
Готовому файлу не нужны Топаз, Cargo или файлы .tpz во время исполнения.
Однако он предназначен для ОС и архитектуры, под которые был собран.
Общий проверяемый пакет
На странице Python используются те же два модуля Топаза. Сначала
src/plan.tpz:
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:
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)
}Проверьте исходный код Топаза
Проверьте пакет, выполните выбранный тест и зафиксируйте эталонный вывод:
topaz check --root . --locked
topaz test tests/plan.tpz --root . --locked
topaz run --root . --locked
Тест сообщает tests/plan.tpz: test-ok, а запуск выводит:
tasks=2, remaining=25 minutesemit для изучения, build для поставки
Используйте emit, только если нужно изучить или интегрировать созданный набор
исходного кода Cargo:
topaz emit --target rust --root . --locked --out-dir ../dist/rust-source
Управляемый платформенный продукт создаётся командой build:
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.jsontopaz-artifact.json записывает цель native, требуемые ОС и архитектуру,
команду запуска, размер и SHA-256 каждого управляемого файла. Топаз записывает
манифест последним и отклоняет изменённый файл, небезопасную коллизию или
другую цель в том же каталоге.
Запустите без доступного исходного кода Топаза
Каталог dist находится вне пакета, поэтому переместите исходный пакет и
запустите только продукт:
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, интерпретатора и бэкендов или артефактов и развёртывания.