Dependencies
Control the order of guarantee execution using requires, after, and before clauses.
Why Dependencies Matter
Sometimes guarantees must happen in a specific order:
# Wrong - might try to encrypt before file exists!
ensure encrypted on file "secrets.db"
ensure exists on file "secrets.db"EnsuraScript's implication system handles many dependencies automatically (encrypted implies exists), but sometimes you need explicit control.
Dependency Clauses
requires - Logical Prerequisite
ensure <condition-A> requires <condition-B>Condition A requires condition B to be satisfied first.
ensure backed_up requires encryptedBefore backing up, ensure encryption is complete.
after - Temporal Ordering
ensure <condition> after <resource>This guarantee runs after all guarantees on the specified resource.
ensure startup on service "app" after file "config.yaml" existsDon't start the service until the config file is ready.
before - Reverse Temporal Ordering
ensure <condition> before <resource>This guarantee runs before all guarantees on the specified resource.
ensure exists on file "config.yaml" before service "app" startupEnsure config exists before the service starts.
Examples
Requires - Logical Dependencies
on file "database.db" {
ensure exists
ensure encrypted with AES:256 key "env:DB_KEY"
ensure backed_up requires encrypted
}The backup won't start until encryption is verified.
After - Service Startup
resource file "/etc/app/config.yaml" as config
resource service "myapp" as app
ensure exists on config
ensure readable on config
ensure running on app after config(Note: service resource type is parsed but not yet implemented)
Before - Preparation Steps
ensure exists on file "/var/log/app.log" before file "/usr/bin/app" startupCreate the log file before starting the application.
Combining Dependencies
You can use multiple dependency clauses:
ensure backed_up requires encrypted after database "mydb" readyThis reads as: "Ensure backed_up, but only after:
encryptedis satisfied (requires)- All guarantees on database mydb are satisfied (after)
Implication vs. Explicit Dependencies
Automatic (Implication)
ensure encrypted on file "secrets.db"
# Automatically ensures: exists, readable, writable FIRSTExplicit (Dependencies)
ensure backed_up requires encrypted
# YOU specify that backed_up depends on encryptedUse implication when possible (less code), use explicit dependencies for business logic ordering.
Dependency Graph
EnsuraScript builds a dependency graph from:
- Implication rules (automatic)
requiresclauses (explicit)after/beforeclauses (explicit)
Then it performs topological sorting to determine execution order.
View the execution order:
ensura plan config.ensView the dependency graph as DOT format:
ensura compile config.ens --graphCycle Detection
If dependencies create a cycle, compilation fails:
ensure A requires B
ensure B requires C
ensure C requires A # CYCLE!Error:
Compilation error: Dependency cycle detected: A → B → C → ANext Steps
Continue to Collections & Invariants to learn how to enforce guarantees across multiple resources.