Rustfmt — Как забыть о спорах о форматировании кода в Rust
Знакомая ситуация? Вы тратите время на выравнивание отступов, спорите с коллегами о пробелах и переносах строк, а код ревью превращается в обсуждение стиля. Rustfmt решает эту проблему раз и навсегда.
Что такое Rustfmt?
Rustfmt — это официальный инструмент для автоматического форматирования Rust-кода согласно стилевому гайдлайну. Это не просто утилита, а часть стандартной поставки Rust (начиная с версии 1.24), что делает его де-факто стандартом для форматирования.
Кстати, проект поддерживается командой Rust-lang и активно развивается — на момент написания статьи в нём участвовало более 6500 звёзд на GitHub и почти 1000 форков.
Почему вам стоит начать использовать Rustfmt сегодня?
1. Мгновенная настройка
Установка занимает одну команду:
rustup component add rustfmt
А форматирование всего проекта — ещё одну:
cargo fmt
2. Гибкая конфигурация
Хотите кастомизировать стиль? Создайте файл rustfmt.toml в корне проекта. Например:
# Применяем стиль edition 2024
style_edition = "2024"
# Настраиваем ширину строки
max_width = 100
# Включаем форматирование цепочек методов
chain_width = 60
Полный список настроек можно посмотреть командой rustfmt --help=config.
3. Интеграция с CI/CD
Можно настроить автоматическую проверку стиля в пайплайнах. Пример для GitHub Actions:
name: Check formatting
run: cargo fmt --all -- --check
Если код не соответствует стилю — сборка упадёт, что особенно полезно для командной разработки.
Продвинутые фишки
Форматирование без компиляции
Rustfmt может форматировать код, который даже не компилируется! Это полезно при рефакторинге или работе с черновиками.
Пропуск определённых участков
Не хотите форматировать какой-то блок? Используйте атрибут #[rustfmt::skip]:
#[rustfmt::skip]
fn this_function_wont_be_formatted() {
println!("This keeps its original formatting");
}
Или для макросов:
#[rustfmt::skip::macros(html)]
let unformatted = html! { <div>
This HTML stays as-is</div> };
Разные режимы вывода
Хотите не применять изменения, а просто посмотреть diff?
cargo fmt -- --emit=diff
Или получить отчёт в JSON?
cargo fmt -- --emit=json
Где Rustfmt не справляется?
Как и любой инструмент, rustfmt имеет ограничения:
- Плохо работает с макросами (хотя поддержка постепенно улучшается)
- Не форматирует комментарии внутри кода
- Может иметь проблемы с не-ASCII символами
- Не обрабатывает фрагменты кода — только полные файлы
Но команда разработчиков постоянно работает над улучшением этих аспектов.
Интеграция с редакторами
Хотите форматировать код на лету? Rustfmt поддерживается всеми популярными редакторами:
- VSCode через rust-analyzer
- IntelliJ/CLion через плагин Rust
- Vim через rust.vim
- Emacs через rust-mode
- Sublime Text 3 через RustFmt
- Atom через соответствующий плагин
Вывод: кому и зачем?
Rustfmt — must-have инструмент для:
- Команд, где важна единообразность кода
- Разработчиков, уставших от ручного форматирования
- Проектов с strict code review
- Тех, кто хочет сфокусироваться на логике, а не на пробелах
Попробуйте — и вы удивитесь, сколько времени освободится для действительно важных задач. А если захотите поучаствовать в развитии проекта — contributing всегда приветствуется!
P.S. Лично я после внедрения rustfmt в проекте сократил время code review на 30% — спорных моментов в форматировании просто не осталось.
