4 ms·
Solutions abound, but one option is to use either Javascript (config.js): // comments! ({ no_quotes: [1, 2, (() => /* code! */)()], ...
by MathMonkeyMan 3y ago
Solutions abound, but one option is to use either Javascript (config.js):
// comments!
({
no_quotes: [1, 2, (() => /* code! */)()],
...
})
Or, let the whole thing be a function. Then your config can have parameters, maybe mapped from environment variables or something.
({foo, bar, ...kwargs}) => ({
datacenter: foo === 'old' ? 'useast1' : 'uswest',
...
})
Can do as Crockford says, and write in the JSON subset of Javascript, but with comments, and convert it to JSON by running it through a JS minifier. I think you need parens around the object, though, or else it looks like a code block (boooo...):
({
// This is very much like JSON
"foo": [1, 2, "bar"]
})
Python also has JSON-like syntax, so you could use config.py:
{
'foo': [1, 2, 'bar']
}
That would require a wrapper script. Or, you can have the self-contained convention:
import json
import sys
# Yay, comments!
json.dump({
# more comments!
'foo': [1, 2, 'bar']
}, sys.stdout)
- throwaway894345 3y agoYeah, I'm mostly just not sure I want to put a full programming language interpreter in my application, especially Python which is not designed to be embeddable. Moreover, I would really want something that is typed, like TypeScript, but libraries for embedded TypeScript interpreters are even more rare :/.
- MathMonkeyMan 3y agoI figure we'd leave it to the build/deploy/CI/development whatever system. I also don't want to extend or embed my application with a full-blown runtime if I don't have to. "source" config --> convert to JSON config "on the fly" --> app that expects JSON edit: I worked on a C++ team that used `std::system` to invoke the system python interpreter when loading a config file. My teammates weren't morons, either, it's just the simplest thing that worked and they knew that the config script and the surrounding file system were secure.
- LorenzoGood 3y agoOr you can produce Configuration with nix