envfmt: Use HashMap as Data Source

Use HashMap as Data Source

Shows how to use your own data, like a HashMap, instead of environment variables.

Sometimes, your variables don’t come from the environment. Maybe you’re loading them from a config file, getting them from a database, or building them inside your program. For these cases, you can use envfmt::format_with().

This function is more flexible than format(). It lets you provide your own data source as long as it implements the Context trait. The good news is that HashMap already works out of the box.

1. The format_with() Function

The format_with() function takes two arguments:

  • input: The template string you want to format.
  • context: A reference to your data source, like a HashMap.

Let’s see how it works.

2. Using a HashMap as Context

In your src/main.rs, let’s create a HashMap and use it to format a string.

src/main.rs
use std::collections::HashMap;

fn main() {
    // 1. Create your context
    let mut context = HashMap::new();
    context.insert("RPC_URL".to_string(), "http://localhost:8545".to_string());

    // You could load your context from a config file.
    // ...

    // 2. Define the template
    let template = "Using RPC URL: ${RPC_URL}";

    // 3. Format the string using your context
    let message = envfmt::format_with(template, &context).unwrap();
    println!("{}", message);
}

Now, run the program:

Shell
cargo run

The output will be:

Plain Text
Using RPC URL: http://localhost:8545

As you can see, envfmt used the values from our HashMap instead of looking at the environment. This is really useful because it lets you use envfmt as a simple templating tool for any data you have.

Why This Works

envfmt can use a HashMap because it implements a special trait called Context. This trait just tells envfmt how to look up a variable by its name. I’ve already implemented it for HashMap<String, _> and HashMap<&str, _> so you don’t have to.