Fat-chunk
Fat-chunk

Reputation: 371

How do I provide default YAML configuration values in a static library?

I have a configuration file system written in C++ which uses the yaml-cpp library to parse and write to YAML files. I have this as part of my static library.

I would like the ability to return a default value for a field that is requested by a user of the library (calling from their code), but which has not been defined in the user's YAML file.

For example say the user wants to use the field foo from their custom config.yaml file:

int bar = config_reader.read<int>( "config.yaml", "foo" );

If they have foo: 10 in their config.yaml then bar will be set to 10. However I would also like to provide a default value (for example 4) in the case where foo is omitted from config.yaml.

There are two possibilities I have thought of:

  1. Have a set of static maps between field names and default values in a cpp file which gets compiled into the static library, however I will need to have different maps for different types and I feel this could get messy with type checking and maybe requiring template specialization methods.

  2. Have a YAML file which contains all of the default values for expected fields, which the configuration system falls back on if it cannot find the field in the user's config file. I think this would be the preferred solution for me, but I cannot think of a neat way of packaging this YAML file. I would rather the user didn't have to copy or point to this file each time they set up a new project linking the static library.

Upvotes: 1

Views: 3304

Answers (1)

Anthon
Anthon

Reputation: 76682

I would provide the defaults in a YAML file in a global (i.e. non-user specific place) and allow to override the values with user-specific ones. Consider just throwing an error if the global defaults are missing an entry, this will not happen by accident.

The global defaults you can put in /etc/default/YOUBLIBNAME.yaml. The user's configuration nowadays mostly follows the XDG base directory specification. For that use $XDG_CONFIG_HOME/YOURLIBNAME/config.yaml if XDG_CONFIG_HOME is set in the environment, if not set use $HOME/.config/YOURLIBNAME/config.yaml.

If your library has to work under Windows, I would put the user specific data under %APPDATA% in a subdir YOURBLINAME.

Upvotes: 1

Related Questions