/ / Cách xây dựng ứng dụng CLI cơ bản trong Rust

Cách xây dựng ứng dụng CLI cơ bản trong Rust

CLI (Giao diện dòng lệnh) rất quan trọng trong phát triển phần mềm và quản trị hệ thống. CLI là các chương trình nhẹ dựa trên văn bản cung cấp cách hợp lý để tương tác với máy tính, thuận lợi cho nhà phát triển cũng như người dùng thành thạo cho nhiều trường hợp sử dụng, bao gồm tự động hóa, tạo tập lệnh và quản trị từ xa.


Rust đang trở nên phổ biến để xây dựng các ứng dụng CLI. Rust cung cấp các tính năng mạnh mẽ như kiểm soát chi tiết đối với phân bổ bộ nhớ và an toàn luồng, an toàn bộ nhớ, đồng thời và song song mà bạn có thể tận dụng để xây dựng các ứng dụng CLI mạnh mẽ. Rust cũng tự hào về một hệ sinh thái phát triển mạnh gồm các thư viện và khung được điều chỉnh rõ ràng để xây dựng các ứng dụng CLI.


Bắt đầu xây dựng ứng dụng CLI với Rust

Có một số gói của bên thứ ba để xây dựng ứng dụng CLI trong Rust, bao gồm vỗ tay, StructOptchấm dứt thùng. Những thùng này cung cấp các tính năng bạn cần để phát triển các công cụ CLI hiện đại.

Ngoài ra, Rust cung cấp một std::env crate trong thư viện chuẩn cung cấp chức năng làm việc với các biến môi trường và đối số dòng lệnh. Các std::env crate cung cấp nhiều phương pháp và kiểu để làm việc với các môi trường theo kiểu độc lập với nền tảng.

Sử dụng std::env thùng, các chương trình Rust của bạn có thể tương tác với môi trường và điều chỉnh hành vi của chúng dựa trên nhiều yếu tố khác nhau, bao gồm biến môi trường, đối số dòng lệnh và thư mục làm việc hiện tại.

Chạy lệnh này để tạo một dự án Rust mới cho ứng dụng CLI của bạn với Cargo, công cụ quản lý gói của Rust:

 cargo new crypto_cli

Bạn sẽ tìm hiểu cách xây dựng ứng dụng CLI gọi API của Coinmarketcap bằng yêu cầu thùng cung cấp các tính năng để thực hiện các yêu cầu HTTP trong Rust.

mở của bạn Cargo.toml tập tin và thêm yêu cầutokio thùng cho các phụ thuộc của dự án của bạn:

 [dependencies]
tokio = { version = "1.15", features = ["full"] }
reqwest = { version = "0.11", features = ["json"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

Các tokio thùng là một thư viện thời gian chạy không đồng bộ tương tác với yêu cầu cho lập trình không đồng bộ. Các người chăn bòserde_json crates giúp tuần tự hóa và giải tuần tự hóa JSON.

bên trong src thư mục của dự án Rust của bạn, tạo api.rscli.rs các tệp nơi bạn sẽ triển khai lệnh gọi API và các chức năng CLI.

 touch src/api.rs src/cli.rs

Lệnh sẽ tạo các tệp mong muốn trong thư mục làm việc của dự án của bạn. Sau khi viết các chức năng trong các tệp được chỉ định của chúng để phân tách các mối quan tâm, bạn sẽ gọi các chức năng trong chủ yếu chức năng trong của bạn chính.rs tài liệu.

Thực hiện các yêu cầu API đối với API của CoinMarketCap với Reqwest

logo coinmarketcap được đặt trên tính năng biểu đồ

API của CoinMarketCap cho phép bạn truy cập và tích hợp dữ liệu tiền điện tử vào các ứng dụng của họ. API cung cấp các điểm cuối cho danh sách, báo giá thị trường, thông tin trao đổi, công cụ chuyển đổi, dữ liệu lịch sử và siêu dữ liệu.

Khi đăng nhập, bạn có thể đăng ký tài khoản CoinMarketCap và truy xuất khóa API của mình trên trang dành cho nhà phát triển của Coinmarketcap. Bạn cũng có thể tham khảo tài liệu để biết hướng dẫn chi tiết và giới hạn tỷ lệ.

Để thực hiện một yêu cầu API tới /v2/tiền điện tử/báo giá/mới nhất điểm cuối trả về báo giá thị trường mới nhất cho một hoặc nhiều loại tiền điện tử, bạn sẽ phải xác định cấu trúc cho dữ liệu bạn muốn trích xuất từ ​​API và chỉ định các thuộc tính có đặc điểm dẫn xuất của Serde.

Sau đó, bạn có thể yêu cầu API tới điểm cuối và sử dụng serde_json crate để giải tuần tự hóa dữ liệu JSON thành cấu trúc để thao tác dễ dàng hơn trên các loại dữ liệu Rust.

Đây là định nghĩa cấu trúc truy xuất nhận dạng, tên, biểu tượng,trích dẫn dữ liệu của các loại tiền điện tử được chỉ định

 #[derive(Debug, Deserialize, Serialize)]
struct ApiResponse {
    data: Data,
}

#[derive(Debug, Deserialize, Serialize)]
struct Data {
    
    #[serde(rename = "1")]
    crypto_1: Cryptocurrency,

    #[serde(rename = "2")]
    crypto_2: Cryptocurrency,

    #[serde(rename = "3")]
    crypto_3: Cryptocurrency,

    #[serde(rename = "4")]
    crypto_4: Cryptocurrency,
}

#[derive(Debug, Deserialize, Serialize)]
struct Cryptocurrency {
    id: u32,
    name: String,
    symbol: String,
    
    quote: Quote,
}

#[derive(Debug, Deserialize, Serialize)]
struct Quote {
    USD: QuoteDetails,
}

#[derive(Debug, Deserialize, Serialize)]
struct QuoteDetails {
    price: f64,
    volume_24h: f64,
    
}

API trả về dữ liệu có thể nhiều hơn bạn cần, nhưng với người chăn bò thùng, bạn có thể chỉ định dữ liệu chính xác mà bạn cần, như minh họa ở trên.

Bây giờ, bạn có thể yêu cầu điểm cuối với Reqwest bằng cách tạo một ứng dụng khách mới thực hiện yêu cầu GET với các tham số bắt buộc.

 use reqwest::Client;
use reqwest::Error;

pub async fn crypto() -> Result<(), Error> {
    let client = Client::new();

    let url = "https://pro-api.coinmarketcap.com/v2/cryptocurrency/quotes/latest";

    let params = [
        ("id", "1,2,3,4"),
        ("convert", "USD"),
    ];

    let response = client.get(url)
        .header("X-CMC_PRO_API_KEY", "YOUR API KEY HERE")
        .query(&params)
        .send().await?;
    ;

    let result: ApiResponse = serde_json::from_str(&*response.text().await?;).unwrap();

    println!("{:#?}", result);
    Ok(())
}

Các tiền điện tử chức năng là một chức năng không đồng bộ kích hoạt tokio yêu cầu điểm cuối với khách hàng.get chức năng sau khi tạo một phiên bản ứng dụng khách với Khách hàng::mới phương pháp.

Các tiêu đề chức năng gọi trên phiên bản trình tạo yêu cầu lấy khóa API của bạn, truy vấn hàm nhận các tham số và gửi chức năng gửi yêu cầu.

Các tiền điện tử chức năng giải tuần tự hóa phản hồi JSON với serde_json’s from_str phương thức nhận vào một chuỗi JSON.

cuối cùng tiền điện tử chức năng in kết quả của hoạt động khử lưu huỳnh ra bàn điều khiển.

Truy xuất các đối số CLI trong Rust

trong bạn cli.rs tệp, bạn sẽ nhập tệp tiền điện tử chức năng từ api.rs tệp và gọi hàm nếu người dùng nhập “tiền điện tử” làm đối số khi chạy dự án với chạy hàng yêu cầu.

Đây là cách bạn có thể sử dụng std::env hàm để lấy đối số từ dòng lệnh:

 use std::env;
use crate::api::crypto;

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

    if args.len() > 1 && args[1] == "crypto" {
        crypto().await.unwrap();
    } else {
        println!("Invalid command. Usage: cargo run crypto");
    }
}

Các cli hàm lấy tất cả các đối số từ dòng lệnh với env::args().collect() chức năng. Các nếu khác câu lệnh kiểm tra xem có đối số bổ sung nào không, “crypto”. Nếu điều kiện đánh giá đúng, thì cli chức năng gọi các tiền điện tử chức năng; nếu không cli chức năng in một chuỗi ra bàn điều khiển.

Cuối cùng, bạn có thể gọi cli chức năng trong chủ yếu chức năng. Bạn phải thêm #[tokio::main] thuộc tính kể từ chủ yếu chức năng không thể không đồng bộ trong Rust.

 mod api;
mod cli;
use crate::cli::cli;

#[tokio::main]
async fn main() {
    cli().await;
}

Các chủ yếu chức năng gọi các cli chức năng với chờ đợi chức năng tạm dừng thực thi cho đến khi có kết quả của một Tương lai sẵn sàng.

Đây là kết quả của việc chạy tiền điện tử chạy hàng hóa yêu cầu:

kết quả từ việc thực hiện yêu cầu

Bạn có thể xây dựng các ứng dụng web tinh vi trong Rust

Rust là một ngôn ngữ lập trình linh hoạt với nhiều trường hợp sử dụng và ứng dụng. Bạn có thể tận dụng các khung web của bên thứ ba như Actix, Rocket và Warp để xây dựng các ứng dụng web trong Rust. Các khung này cung cấp hầu hết các chức năng cần thiết để xây dựng các ứng dụng web hiện đại.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *