Search code examples
grailsgroovydslspring-dslgroovydsl

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:


Solution

  • 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]
        }
    }