in source/aws_profile.c [366:432]
static int s_profile_property_merge(struct aws_profile_property *dest, const struct aws_profile_property *source) {
AWS_ASSERT(dest != NULL && source != NULL);
/*
* Source value overwrites any existing dest value
*/
if (source->value) {
struct aws_string *new_value = aws_string_new_from_string(dest->allocator, source->value);
if (new_value == NULL) {
return AWS_OP_ERR;
}
if (dest->value) {
AWS_LOGF_WARN(
AWS_LS_SDKUTILS_PROFILE,
"property \"%s\" has value \"%s\" replaced during merge",
dest->name->bytes,
dest->value->bytes);
aws_string_destroy(dest->value);
}
dest->value = new_value;
}
dest->is_empty_valued = source->is_empty_valued;
/*
* Iterate sub properties, stomping on conflicts
*/
struct aws_hash_iter source_iter = aws_hash_iter_begin(&source->sub_properties);
while (!aws_hash_iter_done(&source_iter)) {
struct aws_string *source_sub_property = (struct aws_string *)source_iter.element.value;
struct aws_string *dest_key =
aws_string_new_from_string(dest->allocator, (struct aws_string *)source_iter.element.key);
if (dest_key == NULL) {
return AWS_OP_ERR;
}
struct aws_string *dest_sub_property = aws_string_new_from_string(dest->allocator, source_sub_property);
if (dest_sub_property == NULL) {
aws_string_destroy(dest_key);
return AWS_OP_ERR;
}
int was_present = 0;
aws_hash_table_remove(&dest->sub_properties, dest_key, NULL, &was_present);
if (was_present) {
AWS_LOGF_WARN(
AWS_LS_SDKUTILS_PROFILE,
"subproperty \"%s\" of property \"%s\" had value overridden during property merge",
dest_key->bytes,
dest->name->bytes);
}
if (aws_hash_table_put(&dest->sub_properties, dest_key, dest_sub_property, NULL)) {
aws_string_destroy(dest_sub_property);
aws_string_destroy(dest_key);
return AWS_OP_ERR;
}
aws_hash_iter_next(&source_iter);
}
return AWS_OP_SUCCESS;
}