Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[build]
jobs = -1

[target.'cfg(all())']
rustflags = [
"-Wclippy::all",
"-Wclippy::pedantic",
"-Wclippy::nursery",
"-Wclippy::unwrap_used",
"-Aclippy::module_name_repetitions",
"-Aclippy::missing_errors_doc",
]

[net]
git-fetch-with-cli = true
79 changes: 79 additions & 0 deletions .github/workflows/ci-rust.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: rust

on:
push:
branches:
- 'master'
- 'develop'
- 'rust-bindings'
tags-ignore:
- '**'
paths:
- 'rust/**'
- '.github/workflows/ci-rust.yml'

pull_request:
paths:
- 'rust/**'
- '.github/workflows/ci-rust.yml'

workflow_dispatch: ~

env:
CARGO_TERM_COLOR: always
CARGO_NET_GIT_FETCH_WITH_CLI: "true"

jobs:
fmt:
name: fmt
runs-on: ubuntu-latest
defaults:
run:
working-directory: rust
steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt

- name: Format check
run: cargo fmt --check

clippy:
name: clippy
if: ${{ !github.event.pull_request.head.repo.fork }}
runs-on: ubuntu-latest
defaults:
run:
working-directory: rust
steps:
- uses: actions/checkout@v4

- name: Configure git for private repos
run: git config --global url."https://x-access-token:${{ secrets.GH_REPO_READ_TOKEN }}@github.com/".insteadOf "ssh://git@github.com/"

- uses: dtolnay/rust-toolchain@stable
with:
components: clippy

- name: Clippy
run: cargo clippy --features vendored --all-targets -- -D warnings

test:
name: test
if: ${{ !github.event.pull_request.head.repo.fork }}
runs-on: ubuntu-latest
defaults:
run:
working-directory: rust
steps:
- uses: actions/checkout@v4

- name: Configure git for private repos
run: git config --global url."https://x-access-token:${{ secrets.GH_REPO_READ_TOKEN }}@github.com/".insteadOf "ssh://git@github.com/"

- uses: dtolnay/rust-toolchain@stable

- name: Test
run: cargo test --features vendored
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,8 @@ doc/latex
*.idx
.mypy_cache
build/
Testing/
Testing/

# Rust
rust/target/
rust/Cargo.lock
30 changes: 30 additions & 0 deletions rust/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
[workspace]
resolver = "2"
members = ["crates/metkit-sys"]

[workspace.package]
edition = "2024"
license = "Apache-2.0"
repository = "https://github.com/ecmwf/metkit"
rust-version = "1.90"
readme = "README.md"
keywords = ["ecmwf", "weather", "meteorology", "grib"]
categories = ["science"]

[workspace.dependencies]
# Internal
metkit-sys = { path = "crates/metkit-sys" }

# Foundation crates
eckit-sys = { git = "ssh://git@github.com/ecmwf/eckit.git", branch = "rust-bindings", default-features = false }
eccodes-sys = { git = "ssh://git@github.com/ecmwf/eccodes.git", branch = "rust-bindings", default-features = false }

# Build tools
bindman = { git = "ssh://git@github.com/ecmwf/bindman.git", branch = "generate_exception_bridge" }
bindman-build = { git = "ssh://git@github.com/ecmwf/bindman.git", branch = "generate_exception_bridge" }
bindman-utils = { git = "ssh://git@github.com/ecmwf/bindman.git", branch = "generate_exception_bridge" }

# External
cxx = "1.0"
cxx-build = "1.0"
thiserror = "2"
50 changes: 50 additions & 0 deletions rust/crates/metkit-sys/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
[package]
name = "metkit-sys"
version = "1.18.1"
edition.workspace = true
license.workspace = true
repository.workspace = true
rust-version.workspace = true
readme.workspace = true
keywords.workspace = true
categories.workspace = true
description = "C++ bindings to ECMWF metkit library using cxx"
links = "metkit_sys"
build = "build.rs"

[features]
# Defaults: core features
default = ["vendored", "grib", "bufr", "mars2grib", "metkit-config"]

# Build strategy (mutually exclusive)
vendored = ["eckit-sys/vendored", "eccodes-sys/vendored", "eccodes-sys/eccodes-threads"]
system = ["eckit-sys/system", "eccodes-sys/system"]

# Format support (CMake default: ON)
grib = ["eccodes-sys/product-grib"] # GRIB format support (requires eccodes)
bufr = ["eccodes-sys/product-bufr"] # BUFR format support (requires eccodes)
netcdf = [] # NetCDF data support (requires NetCDF library)
odb = [] # ODB data support (requires odc)

# Encoding (CMake default: ON)
mars2grib = ["eckit-sys/geo-codec-grids"] # MARS2GRIB encoder (requires eckit geo codec grids for ORCA/FESOM/ICON)

# Configuration (CMake default: ON)
metkit-config = [] # Install metkit configuration files

# Other (CMake default: OFF)
experimental = [] # Experimental features
fail-on-ccsds = [] # Fail on CCSDS

[dependencies]
cxx.workspace = true
eckit-sys = { workspace = true, default-features = false }
eccodes-sys = { workspace = true, default-features = false }
bindman.workspace = true

[build-dependencies]
cxx-build.workspace = true
bindman-utils.workspace = true
bindman-build.workspace = true

[package.metadata.docs.rs]
41 changes: 41 additions & 0 deletions rust/crates/metkit-sys/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# metkit-sys

Low-level Rust bindings to ECMWF's [metkit](https://github.com/ecmwf/metkit) C++ library.

This crate provides raw FFI bindings using [cxx](https://cxx.rs/). For a safe, ergonomic API, use the higher-level `metkit` crate (planned).

## Features

### Build strategy (mutually exclusive)

- `vendored` - Build metkit and its dependencies (eckit, ecCodes) from source.
- `system` - Link against system-installed metkit.

`vendored` is enabled by default.

### Format support (enabled by default)

- `grib` - GRIB format support. Pulls in `eccodes-sys/product-grib`.
- `bufr` - BUFR format support. Pulls in `eccodes-sys/product-bufr`.

### Format support (off by default; require external libraries)

- `netcdf` - NetCDF data support (requires NetCDF library).
- `odb` - ODB data support (requires odc).

### Encoding (enabled by default)

- `mars2grib` - MARS2GRIB encoder. Pulls in `eckit-sys/geo-codec-grids` for ORCA/FESOM/ICON grid support.

### Configuration (enabled by default)

- `metkit-config` - Install metkit configuration files (e.g. `language.yaml`).

### Other (off by default)

- `experimental` - Experimental upstream features.
- `fail-on-ccsds` - Fail when encountering CCSDS-encoded messages.

## License

Apache-2.0
Loading
Loading