parse winixjson_* environment variables as json config options

This commit is contained in:
Tomasz Sowa 2022-11-25 13:30:51 +01:00
parent 589e889822
commit 66fae598c2
1 changed files with 49 additions and 5 deletions

View File

@ -244,7 +244,7 @@ bool ReadConfigs(const pt::Space::TableType & table, size_t & config_read)
} }
void ReadEnvOption(const char * option) void ReadEnvStringOption(const char * option)
{ {
const char winix_prefix[] = "winix_"; const char winix_prefix[] = "winix_";
size_t prefix_len = sizeof(winix_prefix) - 1; // null terminating table size_t prefix_len = sizeof(winix_prefix) - 1; // null terminating table
@ -253,7 +253,6 @@ void ReadEnvOption(const char * option)
if( pt::is_substr_nc(winix_prefix, option) ) if( pt::is_substr_nc(winix_prefix, option) )
{ {
pt::utf8_to_wide(option + prefix_len, opt); pt::utf8_to_wide(option + prefix_len, opt);
std::wstring::size_type sep = opt.find('='); std::wstring::size_type sep = opt.find('=');
if( sep != std::wstring::npos ) if( sep != std::wstring::npos )
@ -268,12 +267,57 @@ void ReadEnvOption(const char * option)
} }
void ReadConfigFromEnv(const char ** env) bool ReadEnvJsonOption(const char * option)
{ {
const char winix_prefix[] = "winixjson_";
size_t prefix_len = sizeof(winix_prefix) - 1; // null terminating table
std::wstring opt;
bool status = true;
if( pt::is_substr_nc(winix_prefix, option) )
{
pt::utf8_to_wide(option + prefix_len, opt);
std::wstring::size_type sep = opt.find('=');
if( sep != std::wstring::npos )
{
pt::SpaceParser parser;
pt::Space value_space;
pt::SpaceParser::Status parse_status = parser.parse_json(opt.c_str() + sep + 1, value_space, false);
opt.erase(sep);
TemplatesFunctions::locale.ToSmall(opt);
switch(parse_status)
{
case pt::SpaceParser::Status::ok:
app.config.space.add(opt, value_space);
break;
default:
std::cout << "I cannot parse the " << option << " environment variable as JSON" << std::endl;
status = false;
break;
}
}
}
return status;
}
bool ReadConfigFromEnv(const char ** env)
{
bool status = true;
for(size_t i = 0 ; env[i] ; ++i) for(size_t i = 0 ; env[i] ; ++i)
{ {
ReadEnvOption(env[i]); ReadEnvStringOption(env[i]);
if( !ReadEnvJsonOption(env[i]) )
status = false;
} }
return status;
} }
@ -307,7 +351,7 @@ bool ReadConfigs(const pt::Space & options, const char ** env)
if( options.has_key(L"use-env") ) if( options.has_key(L"use-env") )
{ {
ReadConfigFromEnv(env); status = status && ReadConfigFromEnv(env);
} }
app.config.AssignValuesFromSpace(); app.config.AssignValuesFromSpace();