5 个版本

0.2.4 2021 年 5 月 27 日
0.2.3 2021 年 5 月 27 日
0.1.7 2021 年 5 月 20 日
0.0.8 2021 年 5 月 17 日

#32 in #天气

Download history 33/week @ 2024-04-06 39/week @ 2024-04-13 34/week @ 2024-04-20 41/week @ 2024-04-27 39/week @ 2024-05-04 38/week @ 2024-05-11 46/week @ 2024-05-18 36/week @ 2024-05-25 38/week @ 2024-06-01 18/week @ 2024-06-08 32/week @ 2024-06-15 44/week @ 2024-06-22 9/week @ 2024-06-29 10/week @ 2024-07-06 34/week @ 2024-07-13 19/week @ 2024-07-20

每月 78 次下载
用于 5 crates

MIT/Apache

235KB
2.5K SLoC

openweathermap Rust

...是一个 rust crate,它允许您轻松地从 OpenWeatherMap 获取当前天气数据。这是我为了学习 rust 而制作的一个 非官方 扩展,但我希望您能从中获得乐趣。

内容

如何使用

首先将此 crate 添加到您的 Cargo.toml 文件中的依赖项

[dependencies]
openweathermap = "0.2.3"

获取持续的天气更新

然后在 Rust 源文件中使用此 crate,通过调用 openweathermap::init() 获取一个接收器对象。然后您可以使用这个接收器对象来调用 openweathermap::update() 来获取天气更新,如下例所示

extern crate openweathermap;

use openweathermap::{init,update};

fn main() {
    // start our observatory via OWM
    let receiver = &init("Berlin,DE", "metric", "en", "<APIKEY>", 10);
    loop {
        match update(receiver) {
            Some(response) => match response {
                Ok(current) => println!(
                    "Today's weather in {} is {}",
                    current.name.as_str(),
                    current.weather[0].main.as_str()
                ),
                Err(e) => println!("Could not fetch weather because: {}", e),
            },
            None => (),
        }
    }
}

第一步:开始轮询

init() 启动一个线程,该线程将定期轮询 OpenWeatherMap 以获取最新的当前天气报告。然后您可以使用 update() 来请求它。

然后:获取天气更新

update() 获取的结果有三种可能类型,您将不得不面对它们

无新内容: None

update() 如果当前没有可用的更新,则返回 None。这意味着: 您不会收到两次相同的更新!换句话说:update() 不会为您缓存最后的天气更新。

天气更新: CurrentWeather

如果轮询线程通过 update() 下载了新更新,则返回一些 CurrentWeather 对象。CurrentWeather 是一个嵌套的 struct,包含已解析的 json 属性。这些属性在这里有很好的描述 这里

一些错误: Err

出错时,update() 返回一些包含简短错误描述的 String 对象。

可能会出现错误...

  • 最初,当还没有更新时,您将获得一个包含确切字符串 "loading..."(在 openweathermap::LOADING 中预定义)的 Err
  • 如果收到 服务器错误 响应(例如,如果使用了无效的 API 密钥,则返回 401 未授权)。
  • 在解析来自 OpenWeatherMap 的响应时出现 json 错误

只获取一次天气

如果您只需要一次天气信息,可以使用将 init()update() 包装到单个同步或异步调用中的 weather() 方法。在第一次成功的天气更新后,生成的线程将立即停止,并将结果作为返回值。

extern crate openweathermap;
use openweathermap::blocking::weather;

fn main() {
    // start our observatory via OWM
    match &weather("Berlin,DE", "metric", "en", "<APIKEY>") {
        Ok(current) => println!(
            "Today's weather in {} is {}",
            current.name.as_str(),
            current.weather[0].main.as_str()
        ),
        Err(e) => println!("Could not fetch weather because: {}", e),
    }
}

weather() 有一个 阻塞 和一个 非阻塞 变体。

  • 上面的示例使用同步(阻塞)变体 openweathermap::blocking::weather,它不会返回,直到有新的更新。
  • 如果您想自己处理返回的 future,请使用 openweathermap::weather 并异步等待结果,直到有结果。

参考文档

除本介绍外,还有一个参考文档,可以在 这里 找到。

网站

openweathermap.thats-software.com 上,这份 README 文件看起来更好。

github 仓库

有关源代码,请参阅 github.com 上的 此存储库

crates.io

crates.io 上发布。

许可

openweathermap 根据 MIT 许可证LICENSE-MIThttp://opensource.org/licenses/MIT)授权。

依赖关系

~6–22MB
~307K SLoC