Crate ecmwf_opendata

Crate ecmwf_opendata 

Source
Expand description

Rust client for ECMWF Open Data.

This crate is a Rust re-implementation of the core ideas from the upstream ecmwf-opendata Python package: you express a MARS-like request (keyword/value pairs), URLs are derived from that request, and downloads can either fetch whole files or use the .index sidecar to download only matching fields via HTTP range requests.

Quick start

use ecmwf_opendata::{Client, ClientOptions, Request};

let opts = ClientOptions {
    // Python: Client(source="ecmwf", model="ifs", resol="0p25", ...)
    source: "ecmwf".to_string(),
    model: "ifs".to_string(),
    resol: "0p25".to_string(),
    preserve_request_order: false,
    infer_stream_keyword: true,
    ..ClientOptions::default()
};
let client = Client::new(opts)?;

// Builder style
let req = Request::new().r#type("fc").param("msl").step(240).target("data.grib2");
let result = client.retrieve_request(req)?;
println!("{} bytes", result.size_bytes);

Pairs (kwargs-like) style

use ecmwf_opendata::{Client, ClientOptions, RequestValue};

let client = Client::new(ClientOptions::default())?;
let result = client.retrieve_pairs([
    ("type", RequestValue::from("fc")),
    ("param", RequestValue::from("msl")),
    ("step", 240.into()),
    ("target", "data.grib2".into()),
])?;
println!("{}", result.datetime);

Macro (closest to Python client.retrieve(time=..., ...))

use ecmwf_opendata::{retrieve, Client, ClientOptions};

let client = Client::new(ClientOptions::default())?;
let steps: Vec<i32> = (12..=360).step_by(12).collect();

let result = retrieve!(
    client,
    time = 0,
    stream = "enfo",
    type = "ep",
    step = steps,
    param = ["tpg1", "tpg5", "10fgg10"],
    target = "data.grib2",
)?;
println!("{}", result.datetime);

GUI/config style (string key/value pairs)

use ecmwf_opendata::{Client, ClientOptions, Request};

let client = Client::new(ClientOptions::default())?;
let req = Request::from_str_pairs([
    ("time", "0"),
    ("stream", "enfo"),
    ("type", "ep"),
    ("step", "12,24,36"),
    ("param", "tpg1,tpg5,10fgg10"),
    ("target", "data.grib2"),
]);
let _ = client.retrieve_request(req)?;

Notes:

  • Downloads are governed by ECMWF Open Data terms (e.g. attribution requirements).
  • Network conditions vary by mirror/source; if latest() cannot be established, specify date/time explicitly in your request.
  • In line with the upstream Python client, omitting step means “retrieve all available steps”.

Macros§

request
Build a Request using a kwargs-like syntax.
retrieve
Python-like client.retrieve(...) convenience using kwargs-like syntax.

Structs§

Client
ClientOptions
Request
MARS-like request expressed as keyword/value pairs.
Result

Enums§

Error
RequestValue
Value type for a request keyword.

Type Aliases§

EResult