পাঠ ১২.১

Command line argument নেওয়া

Accepting Command Line Arguments

এই অধ্যায়ে আমরা একটা ছোট CLI tool বানাব — minigrep। এটা grep-এর simplified version: file-এর মধ্যে একটা string search করে যেসব line-এ পাওয়া যায় সেগুলো print করে। ৬টা পাঠে ধাপে ধাপে এটা গড়ে উঠবে। প্রথম পাঠে — command line argument নেওয়া।

Project setup

terminalbash
$ cargo new minigrep
$ cd minigrep

লক্ষ্য — এই ভাবে invoke করা:

$ cargo run -- searchstring example-filename.txt

-- cargo-কে বলে দেয় — এর পরের argument program-এর জন্য, cargo-র জন্য না।

env::args()

Standard library-র std::env::args command line argument-এর iterator return করে।

src/main.rsrust
use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    dbg!(args);
}

.collect() iterator-কে collection-এ রূপান্তর করে। এখানে Vec<String> চাই — তাই explicit type annotation, না হলে Rust জানে না কোন collection।

চালিয়ে দেখি:

terminalbash
$ cargo run -- needle haystack
[src/main.rs:5:5] args = [
    "target/debug/minigrep",
    "needle",
    "haystack",
]

লক্ষ্য — args[0] program-এর নাম! এটা C-এর convention; অনেক CLI program নিজের invocation নাম জানতে পারে।

Invalid Unicode

std::env::args argument-এ invalid Unicode থাকলে panic করে। ঐ case-ও handle করতে চাইলে std::env::args_os ব্যবহার করো — যেটা OsString দেয়।

Argument-গুলো variable-এ রাখা

src/main.rsrust
use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();

    let query = &args[1];
    let file_path = &args[2];

    println!("Searching for {query}");
    println!("In file {file_path}");
}

Index 1 query (search string), index 2 file path। Index 0 বাদ — সেটা program-এর নাম।

terminalbash
$ cargo run -- test sample.txt
Searching for test
In file sample.txt

এখনো argument missing হলে error handle করছি না — সেটা পাঠ ১২.৩-এ। পরের পাঠে — file-টা open করে content পড়ব।

এই পাঠ থেকে যা শিখলে

  • std::env::args() command line iterator; .collect() দিয়ে Vec<String>
  • Index 0 program name; user arg index 1 থেকে।
  • cargo run -- arg1 arg2 দিয়ে cargo-কে arg forward।
  • Invalid Unicode-এ args_os + OsString