aboutsummaryrefslogtreecommitdiff
path: root/macros/src/check.rs
diff options
context:
space:
mode:
authorGravatar Jorge Aparicio <jorge@japaric.io> 2017-12-09 17:14:51 +0100
committerGravatar Jorge Aparicio <jorge@japaric.io> 2017-12-09 17:17:56 +0100
commitd30bdcb096774c1f56d9823fb2fbb78bf5cd3584 (patch)
tree0a781ee30567a2f13de11d03f25736bf60d3866f /macros/src/check.rs
parenta6dd004113fcbc03ffacacc519d742ee84886c1d (diff)
downloadrtic-d30bdcb096774c1f56d9823fb2fbb78bf5cd3584.tar.gz
rtic-d30bdcb096774c1f56d9823fb2fbb78bf5cd3584.tar.zst
rtic-d30bdcb096774c1f56d9823fb2fbb78bf5cd3584.zip
safe `&'static mut` references via init.resources
Diffstat (limited to '')
-rw-r--r--macros/src/check.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/macros/src/check.rs b/macros/src/check.rs
index 63cac1fa..f6fd9cc6 100644
--- a/macros/src/check.rs
+++ b/macros/src/check.rs
@@ -77,7 +77,38 @@ pub fn app(app: check::App) -> Result<App> {
}
fn resources(app: &App) -> Result<()> {
+ for name in &app.init.resources {
+ if let Some(resource) = app.resources.get(name) {
+ ensure!(
+ resource.expr.is_some(),
+ "resource `{}`, allocated to `init`, must have an initial value",
+ name
+ );
+ } else {
+ bail!(
+ "resource `{}`, allocated to `init`, must be a data resource",
+ name
+ );
+ }
+
+ ensure!(
+ !app.idle.resources.contains(name),
+ "resources assigned to `init` can't be shared with `idle`"
+ );
+
+ ensure!(
+ app.tasks
+ .iter()
+ .all(|(_, task)| !task.resources.contains(name)),
+ "resources assigned to `init` can't be shared with tasks"
+ )
+ }
+
for resource in app.resources.keys() {
+ if app.init.resources.contains(resource) {
+ continue;
+ }
+
if app.idle.resources.contains(resource) {
continue;
}