Văn bản được tóm tắt bởi AI durumis
- Rust là ngôn ngữ rất phù hợp để viết CLI, và chúng tôi đã triển khai một chương trình CLI đơn giản với tính năng đăng nhập, đăng xuất bằng cách sử dụng thư viện clap và ratatui.
- Thông qua clap, chúng tôi đã định nghĩa các tùy chọn và lệnh phụ khác nhau, và sử dụng ratatui để triển khai cửa sổ nhập liệu tương tác, nâng cao tiện dụng và bảo mật.
- Tính đến ngày 18 tháng 4 năm 2024, tác giả đã giới thiệu cách viết chương trình CLI tiện lợi bằng Rust.
Theo kinh nghiệm của tôi, ngôn ngữ giúp tạo ra CLI chắc chắn và dễ sử dụng nhất là Rust.
Vì khả năng mở rộng macro tuyệt vời của nó cho phép bạn định nghĩa tất cả các ràng buộc và kiểm tra ở cấp độ cấu trúc, và bạn có thể tận hưởng sức mạnh thực sự của kiểu đó.
Trong bài viết này, chúng ta sẽ cùng nhau xây dựng một chương trình ví dụ CLI đơn giản để xử lý đăng nhập, đăng xuất bằng clap và ratatui, thông qua đó chúng ta sẽ giới thiệu sơ lược về cách viết và cách áp dụng.
Cài đặt clap
Đầu tiên, hãy thêm 4 nội dung sau đây vào phụ thuộc.
```javascript atty = { version = "0.2.14", optional = true } structopt = { version = "0.3.18", optional = true } clap = { version = "4.4.18", features = ["derive"] } serde = { version = "1", features = ["derive"] }
2 cái ở trên là để ánh xạ lệnh cargo, còn 2 cái ở dưới là để phân tích cú pháp clap.
Bây giờ, chúng ta hãy từng bước thêm mã vào.
Trước tiên, chúng ta hãy định nghĩa loại lệnh cấp cao nhất, rồi đưa một enum lệnh phụ vào bên trong đó.
Enum SubCommand sẽ chứa lệnh đăng nhập và đăng xuất mà chúng ta sẽ định nghĩa ngay sau đây.
Và sau khi khởi tạo lệnh theo cách như trên, khuôn mẫu cơ bản của chúng ta đã được hoàn thiện.
Chương trình được tạo theo cách này có thể được chạy qua cargo run hoặc
có thể cài đặt rồi chạy thông qua cargo install.
Định nghĩa lệnh phụ
Bây giờ, chúng ta sẽ bắt đầu từng bước định nghĩa lệnh phụ.
Login và Logout sẽ được tách riêng thành các lệnh phụ riêng biệt.
Chúng ta đã tạo một tệp riêng để định nghĩa trước lệnh login.
Chúng ta định nghĩa các yếu tố cờ thông qua đối tượng Option ở bên trong.
short biểu thị sẽ tạo một phím tắt dạng -i, còn long biểu thị sẽ tạo một văn bản đầy đủ dạng --id. help thì dĩ nhiên là trợ giúp.
Để biến các cờ đó thành các phần tử Optional, bạn cần nhập kiểu là Option hoặc gán thuộc tính default_value.
Và chúng ta thêm nó vào biến thể của lệnh phụ ở đối tượng lệnh cấp cao nhất.
Bây giờ là lệnh logout. Lệnh này dễ hơn nhiều.
Vì chúng ta không cần cung cấp tùy chọn nào cả.
Tương tự như vậy, chúng ta cũng đăng ký lệnh này thành lệnh phụ của lệnh cấp cao nhất.
Ở điểm vào, hành động cũng được phân nhánh thành enum, nên nếu khớp mẫu một cách phù hợp, chúng ta chỉ cần phân nhánh cho phù hợp.
Và nếu thực thi,
bạn sẽ thấy nội dung đã được thêm vào danh sách lệnh phụ.
Thực hiện cũng rất tốt. Nếu bạn bỏ qua cờ bắt buộc, lệnh sẽ nhắc rằng cờ đó không có.
Nếu bạn đưa vào, lệnh sẽ hoạt động tốt. Nhưng hiện tại thì lệnh vẫn chưa thực hiện bất kỳ hành động nào.
Tách và triển khai hành động
Bây giờ, chúng ta sẽ thêm phần triển khai một cách phù hợp. Trong trường hợp này, tôi thích tách biệt logic theo từng tệp. Nếu hợp nhất, mọi thứ sẽ trông rất khó xem và lộn xộn.
Chúng ta đặt một mô-đun hành động và đặt từng tệp cho từng hành động của lệnh phụ.
Các hàm hành động riêng lẻ