Skip to content
Merged
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
2 changes: 2 additions & 0 deletions .github/workflows/cd-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- run: cargo publish --dry-run --package trussed-core
if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip-publish-check-trussed-core') }}
- run: cargo publish --dry-run --package trussed-derive
if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip-publish-check-trussed-derive') }}
- run: cargo publish --dry-run --package trussed
if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip-publish-check-trussed') }}
9 changes: 9 additions & 0 deletions derive/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Changelog

## Unreleased

-

## [v0.1.0](https://github.com/trussed-dev/trussed/releases/tag/derive-v0.1.0) (2026-09-21)

Initial release compatible with `trussed` v0.2 and `trussed-core` v0.2.
9 changes: 7 additions & 2 deletions derive/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[package]
name = "trussed-derive"
version = "0.1.0"
description = "Derive macros for the trussed crate"

authors.workspace = true
edition.workspace = true
Expand All @@ -17,5 +18,9 @@ syn = "2.0.53"

[dev-dependencies]
serde = { version = "1.0", default-features = false }
trussed = { path = "..", features = ["serde-extensions", "virt"] }
trussed-core = { path = "../core", features = ["serde-extensions"] }
trussed = { version = "0.2", features = ["serde-extensions", "virt"] }
trussed-core = { version = "0.2", features = ["serde-extensions"] }
trussed-fs-info = "0.3"
trussed-manage = "0.3"
trussed-rsa-alloc = "0.5"
trussed-staging = { version = "0.5", features = ["fs-info", "manage"] }
25 changes: 23 additions & 2 deletions derive/src/extension_dispatch.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::collections::HashMap;
use std::collections::{HashMap, HashSet};

use proc_macro2::TokenStream;
use quote::quote;
Expand Down Expand Up @@ -47,12 +47,33 @@ impl ExtensionDispatch {
)?);
}
}
let delegated_backends = delegated_backends
let delegated_backends: Vec<_> = delegated_backends
.into_iter()
.map(|(raw, delegate_to)| {
DelegatedBackend::new(raw, delegate_to, &backends, &extension_attrs.extensions)
})
.collect::<Result<_>>()?;

// ensure that all extensions that are declared are implemented at least once
let all_extensions: HashSet<_> = extension_attrs.extensions.keys().collect();
let backend_extensions = backends.iter().flat_map(|backend| &backend.extensions);
let delegated_backend_extensions = delegated_backends
.iter()
.flat_map(|backend| &backend.extensions);
let implemented_extensions: HashSet<_> = backend_extensions
.chain(delegated_backend_extensions)
.map(|extension| &extension.id)
.collect();
let mut missing_extensions = all_extensions.difference(&implemented_extensions);
// TODO: this should be a loop with warnings instead, but this is currently not possible
// with stable Rust
if let Some(e) = missing_extensions.next() {
return Err(Error::new_spanned(
e,
format!("Extension {e} declared but not implemented by any backend"),
));
}

Ok(Self {
name: input.ident,
generics: input.generics,
Expand Down
Loading
Loading