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:

rust
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:

bash
cargo fmt

Output yang Dihasilkan (isi src/main.rs setelah pemformatan bawaan — tidak berubah):

rust
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:

toml
max_width = 60

Jalankan kembali formatter, lalu tampilkan hasilnya:

bash
cargo fmt

Output yang Dihasilkan (isi src/main.rs setelah pemformatan dengan konfigurasi):

rust
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:

  1. Baris 5 sebelum pemformatan (println!("Terima kasih ...");): baris sepanjang 87 karakter lolos dari gaya bawaan karena max_width bawaan adalah 100 — rustfmt tidak punya alasan memecahnya.
  2. File rustfmt.toml (max_width = 60): konfigurasi menurunkan batas lebar menjadi 60. Sekarang baris 87 karakter melanggar, dan rustfmt wajib membungkusnya.
  3. Baris 5-7 setelah pemformatan: macro println! dipecah menjadi tiga baris — buka println!(, argumen string di baris tersendiri dengan indentasi 8 (dua tingkat), dan tutup ); di baris terakhir. Inilah pola pembungkusan argumen rustfmt ketika pemanggilan melebihi max_width.
  4. 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.
  5. 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:

bash
cargo run

Output yang Dihasilkan:

text
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:

toml
hard_tabs = true
max_width = 60

Output yang Dihasilkan (kutipan hasil format):

rust
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:

toml
overflow_delimited_expr = true

Output yang Dihasilkan (saat cargo fmt berjalan pada toolchain stabil):

text
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.