Crates.io | fluid-let |
lib.rs | fluid-let |
version | 1.0.0 |
source | src |
created_at | 2019-03-12 18:06:29.699347 |
updated_at | 2021-10-12 12:48:50.861607 |
description | Dynamically scoped variables |
homepage | |
repository | https://github.com/ilammy/fluid-let |
max_upload_size | |
id | 120316 |
size | 30,759 |
fluid-let implements dynamically scoped variables.
Dynamic or fluid variables are a handy way to define global configuration values. They come from the Lisp family of languages where they are relatively popular for this use case.
Add this to your Cargo.toml:
[dependencies]
fluid-let = "1"
You can declare global dynamic variables using fluid_let!
macro.
Suppose you want to have a configurable Debug
implementation for your hashes,
controlling whether to print out the whole hash or a truncated version:
use fluid_let::fluid_let;
fluid_let!(pub static DEBUG_FULL_HASH: bool);
Enable full print out using the fluid_set!
macro.
Assignments to dynamic variables are effective for a certain dynamic scope.
In this case, while the function is being executed:
use fluid_let::fluid_set;
fn some_important_function() {
fluid_set!(DEBUG_FULL_HASH, &true);
// Hashes will be printed out with full precision in this function
// as well as in all functions that it calls.
}
And here is how you can implement Debug
that uses dynamic configuration:
impl fmt::Debug for Hash {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let full = DEBUG_FULL_HASH.copied().unwrap_or(false);
write!(f, "Hash(")?;
if full {
for byte in &self.value {
write!(f, "{:02X}", byte)?;
}
} else {
for byte in &self.value[..4] {
write!(f, "{:02X}", byte)?;
}
write!(f, "...")?;
}
write!(f, ")")
}
}
Here we print either the full value of the hash, or a truncated version, based on whether debugging mode has been enabled by the caller or not.
The code is licensed under MIT license (see LICENSE).