Vahid Pazirandeh Vahid Pazirandeh - 2 months ago 13
Groovy Question

How to create a DSL Groovy config file using an arbitrary Map (dynamic object)

How do I convert an arbitrary Groovy map / list to the config style DSL syntax that Groovy provides?

Example:

def config = [
'test': 'lalala',
'nestedObject': [
foo1: 'foo1 val',
foo2: 'foo2 val',
nested2: [
anInt: 5,
anArray: ['a', 'b', 'c'],
anIntArray: [1, 2, 3]
]
]
]


To something like:

test = 'lalala'
nestedObject {
foo1 = 'foo1 val'
foo2 = 'foo2 val'
nested2 {
anInt = 5
anArray = ['a', 'b', 'c']
anIntArray = [1, 2, 3]
}
}





UPDATE:


Answer

If you know the nested Map structure in advance, your solution will work. If you need to do this on an unknown arbitrary nested Map structure, try something like this:

import groovy.util.ConfigObject

def mapToConfig
mapToConfig = { Map map ->
    map.collectEntries { k, v ->
        v instanceof Map ? [(k):mapToConfig(v)] : [(k):v]
    } as ConfigObject
}

Given your input and the above closure definition, the following print statement:

println mapToConfig(config).prettyPrint()

Yields this output:

test='lalala'
nestedObject {
    foo1='foo1 val'
    foo2='foo2 val'
    nested2 {
        anInt=5
        anArray=['a', 'b', 'c']
        anIntArray=[1, 2, 3]
    }
}