使用Rust开发命令行工具

生成二进制文件,将其扔到环境变量的path下即可~

用rust打造实时天气命令行工具[1]

找到合适的API

使用该api[2]

如请求 api.openweathermap.org/data/2.5/weather?q=Beijing&appid=your_key:

复制代码
{
 "coord": {
  "lon": 116.3972,
  "lat": 39.9075
 },
 "weather": [{
  "id": 803,
  "main": "Clouds",
  "description": "broken clouds",
  "icon": "04d"
 }],
 "base": "stations",
 "main": {
  "temp": 293.35,
  "feels_like": 292.34,
  "temp_min": 291.09,
  "temp_max": 294.13,
  "pressure": 1026,
  "humidity": 35,
  "sea_level": 1026,
  "grnd_level": 1020
 },
 "visibility": 10000,
 "wind": {
  "speed": 4.86,
  "deg": 344,
  "gust": 7.43
 },
 "clouds": {
  "all": 73
 },
 "dt": 1634262993,
 "sys": {
  "type": 2,
  "id": 2021025,
  "country": "CN",
  "sunrise": 1634250256,
  "sunset": 1634290552
 },
 "timezone": 28800,
 "id": 1816670,
 "name": "Beijing",
 "cod": 200
}

初始化项目&coding

使用cargo new rust_weather 初始化一个项目。

对于cargo.toml文件:

复制代码
[package]
name = "rust_weather"
version = "0.1.0"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
structopt = "0.3.21"
exitfailure = "0.5.1"
serde = "1.0.114"
serde_json = "1.0.56"
serde_derive = "1.0.114"
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }

对于src/main.rs文件:

复制代码
use exitfailure::ExitFailure;
use reqwest::Url;
use serde_derive::{Deserialize, Serialize};
use structopt::StructOpt;

#[derive(Serialize,Deserialize,Debug)]
struct W {
    coord: Coord,
    weather: Weather,
    base: String,
    main: Main,
}

impl W {
    async fn get(city: &String) -> Result<Self, ExitFailure> {
        let url = format!("https://api.openweathermap.org/data/2.5/weather?q={}&appid=40452068d845180226c3f289341974b7", city);
        // 转换为url
        let url = Url::parse(&*url)?;
        let resp = reqwest::get(url).await?.json::<W>().await?;
        Ok(resp)
    }
}

#[derive(Serialize,Deserialize,Debug)]
struct Coord {
    lon: f64,
    lat: f64,
}

#[derive(Serialize,Deserialize,Debug)]
struct Weather {
    details: Details,
}

#[derive(Serialize,Deserialize,Debug)]
struct Details {
    id: i32,
    main: String,
    description: String,
    icon: String,
}

#[derive(Serialize,Deserialize,Debug)]
struct Main {
    temp: f64,
    feels_like: f64,
    temp_min: f64,
    temp_max: f64,
    pressure: i32,
    humidity: i32,

}


#[derive(StructOpt)]
struct Input {
    city: String
}

#[tokio::main]
async fn main() -> Result<(), ExitFailure> {
    let input = Input::from_args();
    //println!("{}", input.city);


    let resp = W::get(&input.city).await?;

    println!("{} \n 天气: {} \n 当前温度: {} \n 最高温度: {} \n 最低温度: {} \n 湿度: {}", input.city, resp.weather.details.main, resp.main.temp, resp.main.temp_max, resp.main.temp_min, resp.main.humidity);

    //println!("Hello, world!");
    Ok(())
}

使用cargo run Beijing进行调试

直到能够准确输出预订结果,如下:

复制代码
➜  rust_weather git:(master) ✗ cargo run Beijing
    Finished dev [unoptimized + debuginfo] target(s) in 0.13s
     Running `target/debug/rust_weather Beijing`
Beijing 
 天气: Clouds 
 当前温度: 293.35 
 最高温度: 294.13 
 最低温度: 291.09 
 湿度: 35

将二进制文件移动到系统PATH路径下

此时target/debug/rust_weather即想要的二进制文件,可将其复制到任意一个系统PATH路径下

echo $PATH

复制代码
/opt/homebrew/opt/node@12/bin:/Users/fliter/.nvm/versions/node/v16.9.0/bin:/usr/local/Cellar/mysql@5.7/5.7.28/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Users/fliter/.cargo/bin:/usr/local/go/bin:/Users/fliter/go/bin:/Users/fliter/Downloads/:/bin:/usr/local/MongoDB/bin:/usr/local/Cellar/ffmpeg/4.3.1/bin:/Users/fliter/.cargo/bin

还可以重命名,如改为weather,复制到usr/local/bin 下,而后source .zshrc

在任意命令行窗口下,执行 weather Binzhou:

复制代码
Binzhou 
 天气: Rain 
 当前温度: 291.63 
 最高温度: 291.63 
 最低温度: 291.63 
 湿度: 67

参考自原子之音[3]

参考资料

1

用rust打造实时天气命令行工具: https://www.bilibili.com/video/BV1eL411b7EL

2

该api: https://openweathermap.org/api

3

原子之音: https://www.bilibili.com/video/BV1eL411b7EL

本文由mdnice多平台发布

相关推荐
独自破碎E2 分钟前
Spring Boot测试启动失败:SLF4J日志多实现冲突解决方案
spring boot·后端·log4j
Coder_Boy_8 分钟前
企业级项目高并发监控场景-Spring Boot 集成 Graphite & InfluxDB 实战文档
java·spring boot·后端·系统架构
索荣荣13 小时前
Java Session 全面指南:原理、应用与实践(含 Spring Boot 实战)
java·spring boot·后端
千寻技术帮14 小时前
10333_基于SpringBoot的家电进存销系统
java·spring boot·后端·源码·项目·家电进存销
dear_bi_MyOnly14 小时前
【多线程——线程状态与安全】
java·开发语言·数据结构·后端·中间件·java-ee·intellij-idea
小信丶15 小时前
@EnableTransactionManagement注解介绍、应用场景和示例代码
java·spring boot·后端
To Be Clean Coder15 小时前
【Spring源码】createBean如何寻找构造器(四)——类型转换与匹配权重
java·后端·spring
-孤存-16 小时前
SpringBoot核心注解与配置详解
java·spring boot·后端
2301_8187320617 小时前
项目启动报错,错误指向xml 已解决
xml·java·数据库·后端·springboot
小王不爱笑13217 小时前
SpringBoot 整合 Ollama + 本地 DeepSeek 模型
java·spring boot·后端