Gaya baku rustfmt dirancang untuk mayoritas proyek, dan angka-angkanya memang bukan hasil tebakan: lebar baris 100, indentasi empat spasi, dan aturan pembungkusan sudah diuji pada kode basis besar selama bertahun-tahun. Namun tim tertentu punya kebijakan sendiri — misalnya standar internal membatasi lebar baris 60 agar nyaman dibaca di layar terpisah, atau kodebase lama yang memakai tab. rustfmt tidak memaksakan gaya bakunya secara mutlak: satu file konfigurasi rustfmt.toml di root proyek mengubah perilaku formatter untuk seluruh tim yang mengerjakan proyek tersebut. Chapter ini mengubah opsi nyata satu per satu, mengamati dampaknya pada hasil format, dan menutup dengan batasan penting seputar opsi yang hanya tersedia di Rust versi nightly.
Masalah: Satu Gaya Baku, Banyak Kebijakan Tim #
File yang sudah terformat rustfmt terlihat seragam di mana pun — sampai proyek berikutnya memakai kebijakan berbeda. Tanpa file konfigurasi, tiap anggota tim harus mengingat kebijakan secara manual, dan editor yang menjalankan rustfmt otomatis akan memformat dengan gaya bawaan yang mungkin melanggar kebijakan tim. Konfigurasi menyelesaikan ini dengan satu sumber kebenaran: file rustfmt.toml ikut disimpan di repository, terbaca otomatis oleh cargo fmt siapa pun yang menjalankannya, di mesin siapa pun.
Mekanisme: rustfmt Mencari File Konfigurasi #
Setiap kali berjalan, rustfmt mencari file bernama rustfmt.toml atau .rustfmt.toml di root proyek — direktori tempat Cargo.toml berada. Opsi di file itu menimpa nilai bawaan: max_width mengubah lebar baris, hard_tabs mengganti spasi indentasi dengan karakter tab, dan tab_spaces mengatur lebar satu tingkat indentasi. Nilai bawaan yang penting kita hafal untuk membandingkan: max_width = 100, hard_tabs = false, dan tab_spaces = 4. Jika file konfigurasi tidak ditemukan, rustfmt memakai seluruh nilai bawaan tersebut. Konfigurasi berlaku untuk seluruh file di proyek — rustfmt tidak mengizinkan gaya berbeda per file, prinsip yang konsisten dengan tujuan awalnya: keseragaman.
Contoh: Menaikkan Batas Lebar Baris #
Buat proyek baru dan isi src/main.rs dengan program yang punya satu baris panjang:
fn main() {
let judul = "Pengumuman Libur Idul Fitri";
let isi = "Warung kopi tutup sementara selama tujuh hari penuh.";
println!("{} - {}", judul, isi);
println!("Terima kasih atas pengertian para pelanggan setia warung kopi senja.");
}Baris println! terakhir panjangnya 87 karakter — masih di bawah batas bawaan 100, jadi pemformatan bawaan membiarkannya:
cargo fmtOutput yang Dihasilkan (isi src/main.rs setelah pemformatan bawaan — tidak berubah):
fn main() {
let judul = "Pengumuman Libur Idul Fitri";
let isi = "Warung kopi tutup sementara selama tujuh hari penuh.";
println!("{} - {}", judul, isi);
println!("Terima kasih atas pengertian para pelanggan setia warung kopi senja.");
}Sekarang terapkan kebijakan tim: lebar baris maksimum 60. Buat file rustfmt.toml di root proyek, sejajar dengan Cargo.toml:
max_width = 60Jalankan kembali formatter, lalu tampilkan hasilnya:
cargo fmtOutput yang Dihasilkan (isi src/main.rs setelah pemformatan dengan konfigurasi):
fn main() {
let judul = "Pengumuman Libur Idul Fitri";
let isi = "Warung kopi tutup sementara selama tujuh hari penuh.";
println!("{} - {}", judul, isi);
println!(
"Terima kasih atas pengertian para pelanggan setia warung kopi senja."
);
}Mari kita bedah apa yang terjadi:
- Baris 5 sebelum pemformatan (
println!("Terima kasih ...");): baris sepanjang 87 karakter lolos dari gaya bawaan karenamax_widthbawaan adalah 100 — rustfmt tidak punya alasan memecahnya. - File
rustfmt.toml(max_width = 60): konfigurasi menurunkan batas lebar menjadi 60. Sekarang baris 87 karakter melanggar, dan rustfmt wajib membungkusnya. - Baris 5-7 setelah pemformatan: macro
println!dipecah menjadi tiga baris — bukaprintln!(, argumen string di baris tersendiri dengan indentasi 8 (dua tingkat), dan tutup);di baris terakhir. Inilah pola pembungkusan argumen rustfmt ketika pemanggilan melebihimax_width. - Baris argument string (
"Terima kasih ... senja."): baris ini tetap 74 karakter, melebihi 60. rustfmt tidak bisa berbuat lebih — string literal tidak dapat dipecah tanpa mengubah program — jadi string dibiarkan utuh sepanjang apa pun panjangnya. - Baris 2-4 (
let judul,let isi,println!("{} - {}", ...)): ketiga baris ini di bawah 60 karakter sehingga tidak tersentuh pembungkusan; perbandingan ini menegaskan bahwa rustfmt hanya membungkus baris yang melampaui batas, bukan semua baris panjang apa pun.
Program tetap berjalan dengan hasil yang sama — mari kita pastikan:
cargo runOutput yang Dihasilkan:
Pengumuman Libur Idul Fitri - Warung kopi tutup sementara selama tujuh hari penuh.
Terima kasih atas pengertian para pelanggan setia warung kopi senja.Opsi Indentasi: hard_tabs dan tab_spaces #
Dua opsi lain yang paling sering dipakai mengatur indentasi. Opsi hard_tabs = true mengganti indentasi spasi menjadi karakter tab, sementara tab_spaces menentukan berapa spasi setara satu tingkat indentasi. Kombinasinya memungkinkan kebijakan seperti “tab untuk indentasi, tampilan 4 kolom”. Contoh hasil rustfmt.toml berikut pada program yang sama:
hard_tabs = true
max_width = 60Output yang Dihasilkan (kutipan hasil format):
fn main() {
let judul = "Pengumuman Libur Idul Fitri";
println!(
"Terima kasih atas pengertian para pelanggan setia warung kopi senja."
);
}Perhatikan karakter \t di awal baris dalam file hasil — indentasi kini tab, bukan spasi, dan kedalaman visual tab diikuti aturan tab_spaces (bawaan 4) saat rustfmt menghitung lebar baris. Sebaliknya, kebijakan dua spasi cukup memakai tab_spaces = 2 tanpa hard_tabs, yang menghasilkan indentasi dua spasi pada seluruh blok.
Opsi Nightly dan Batasnya #
Tidak semua opsi tersedia di toolchain stabil. Sebagian opsi rustfmt ditandai unstable dan hanya aktif pada Rust nightly. Menuliskannya di rustfmt.toml pada toolchain stabil tidak menghentikan pemformatan — rustfmt mencatat warning dan mengabaikan opsi tersebut. Contoh dengan opsi overflow_delimited_expr:
overflow_delimited_expr = trueOutput yang Dihasilkan (saat cargo fmt berjalan pada toolchain stabil):
Warning: can't set `overflow_delimited_expr = true`, unstable features are only available in nightly channel.Warning ini mengingatkan dua hal: opsi diabaikan sehingga hasil format tetap memakai aturan stabil, dan menandai bahwa konfigurasi proyek bergantung pada perilaku nightly bila dibiarkan. Untuk konten pembelajaran dan proyek tim dengan toolchain stabil, praktik terbaiknya membatasi konfigurasi pada opsi stabil — max_width, hard_tabs, dan tab_spaces termasuk opsi stabil yang aman dipakai di mana saja.
Ringkasan #
File rustfmt.toml di root proyek menimpa gaya bawaan rustfmt untuk seluruh tim: max_width mengubah lebar baris (bawaan 100), hard_tabs mengganti spasi dengan tab, dan tab_spaces mengatur kedalaman indentasi (bawaan 4). Pembungkusan mengikuti batas baru — pemanggilan dipecah per argumen, sementara string literal panjang dibiarkan utuh karena tidak bisa dipecah. Opsi unstable diabaikan dengan warning pada toolchain stabil, jadi konfigurasi tim sebaiknya berpegang pada opsi stabil. Dengan formatter beres, kita berpindah ke lapisan kualitas berikutnya: alat yang membaca maksud kode dan menyarankan idiom yang lebih baik — clippy.