Code Monkey home page Code Monkey logo

Comments (3)

martinohmann avatar martinohmann commented on May 27, 2024

Hi @vlad-ivanov-name,

your use case is already supported, just use a nested map and serialize it as a hcl::Value via hcl::to_value(map).

Here is a example (i'm using IndexMap here, but other maps like HashMap will also do):

use hcl::eval::Context;
use indexmap::indexmap;
use serde::Deserialize;

#[derive(Deserialize, Debug, PartialEq, Eq)]
struct Config {
    stages: u64,
}

let stages = indexmap! {
    "project_test" => indexmap! {
        "id" => 1,
    }
};

let mut ctx = Context::new();
ctx.declare_var("stage", hcl::to_value(stages).unwrap());

let input = "stages = stage.project_test.id";

let config: Config = hcl::eval::from_str(input, &ctx).unwrap();

assert_eq!(config, Config { stages: 1 });

It's also possible to do this with a map of structs or even just a struct as long as the struct implements Serialize:

use hcl::eval::Context;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Deserialize, Debug, PartialEq, Eq)]
struct Config {
    stages: u64,
}

#[derive(Serialize)]
struct Stage {
    id: u64,
}

let mut stages = HashMap::new();
stages.insert("project_test", Stage { id: 1 });

let mut ctx = Context::new();
ctx.declare_var("stage", hcl::to_value(stages).unwrap());

let input = "stages = stage.project_test.id";

let config: Config = hcl::eval::from_str(input, &ctx).unwrap();

assert_eq!(config, Config { stages: 1 });

from hcl-rs.

martinohmann avatar martinohmann commented on May 27, 2024

I'm planning to add some testable examples for use cases like this, but I'm currently short on time, so not sure when I will get to this.

from hcl-rs.

vlad-ivanov-name avatar vlad-ivanov-name commented on May 27, 2024

Thank you! I've also found that declaring variables as "body" also works:

        let mut ctx = hcl::eval::Context::new();

        let inner_body = hcl::Body::builder()
            .add_attribute(("id", 1))
            .build();

        let body = hcl::Body::builder()
            .add_attribute(("project_test", inner_body))
            .build();

        ctx.declare_var("stage", body);

from hcl-rs.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.