Vulcan provides a type-safe YAML configuration system with environment variable expansion and config chaining.
Quick Start
auto name = config.Require<std::string>("name");
auto dt = config.Get<double>("dt", 0.01);
static YamlNode LoadFile(const std::string &path)
Load from file.
Definition YamlNode.hpp:54
Definition CSVExport.hpp:20
Headers
YamlNode API
Loading
static YamlNode Parse(const std::string &yaml_content)
Parse from string.
Definition YamlNode.hpp:63
Value Extraction
auto value = node.Require<std::string>("key");
auto value = node.Get<int>("key", 42);
auto value = node.GetOptional<double>("key");
Navigation
auto child = node["nested"]["path"];
bool exists = node.Has("key");
std::size_t len = node.Size();
Iteration
node[
"items"].ForEach([](
const YamlNode& item) {
std::cout << item.
As<std::string>() <<
"\n";
});
node.ForEachEntry([](
const std::string& key,
const YamlNode& value) {
std::cout << key <<
": " << value.
As<
int>() <<
"\n";
});
auto vec = node["values"].ToVector<double>();
Wrapper around yaml-cpp node with ergonomic accessors.
Definition YamlNode.hpp:47
T As() const
Get required value from current node.
Janus Types
# Vec3: [x, y, z]
position: [1000.0, 2000.0, 3000.0]
# Quaternion: [w, x, y, z] (scalar-first)
orientation: [1.0, 0.0, 0.0, 0.0]
# Mat3: nested rows or flat array
inertia:
- [100, 0, 0]
- [0, 200, 0]
- [0, 0, 150]
auto pos = config.Require<janus::Vec3<double>>("position");
auto quat = config.Require<janus::Quaternion<double>>("orientation");
auto mat = config.Require<janus::Mat3<double>>("inertia");
Environment Variables
Syntax
| Pattern | Behavior |
| ${VAR} | Required (throws if undefined) |
| ${VAR:default} | Optional with fallback |
| $${VAR} | Escape (produces literal ${VAR}) |
Usage
static std::string Expand(const std::string &value, bool strict=true)
Expand environment variables in a string.
Definition YamlEnv.hpp:54
static YamlNode LoadFileWithEnv(const std::string &path)
Load YAML file with environment variable expansion.
Definition YamlEnv.hpp:159
Example Config
# config.yaml
output_dir: ${OUTPUT_DIR:/tmp/vulcan}
log_level: ${LOG_LEVEL:info}
api_key: ${API_KEY} # Required
Config Chaining
Include Directive
# main.yaml
database: !include database.yaml
settings: !include config/settings.yaml
static YamlNode LoadWithIncludes(const std::string &path)
Load YAML from file with !include directive resolution.
Definition YamlFile.hpp:37
File Merging
Layer multiple configs (later files override earlier):
"defaults.yaml",
"environment.yaml",
"local.yaml"
});
static YamlNode MergeFiles(const std::vector< std::string > &paths)
Merge multiple YAML files (later files override earlier).
Definition YamlFile.hpp:60
Combined: Includes + Envvars
static YamlNode LoadWithIncludesAndEnv(const std::string &path)
Load with includes AND environment expansion.
Definition YamlEnv.hpp:172
Error Handling
try {
auto value = node.
Require<
int>(
"missing_key");
}
try {
}
Exception for undefined environment variables.
Definition YamlEnv.hpp:25
Exception for YAML parsing/access errors.
Definition YamlNode.hpp:27
T Require(const std::string &key) const
Get required value (throws YamlError if missing or wrong type).
Definition YamlNode.hpp:122
Example: Mission Config
# mission.yaml
mission:
name: ${MISSION_NAME:Demo Mission}
spacecraft: !include spacecraft.yaml
simulation:
dt: 0.01
max_time: 3600.0
output_dir: ${OUTPUT_DIR:/tmp/sim}
auto name = config["mission"].Require<std::string>("name");
auto mass = config[
"spacecraft"].Require<
double>(
"mass_kg");
auto pos = config["spacecraft"].Require<janus::Vec3<double>>("position");
Definition MassProperties.hpp:12