I have a nested list that should follow a rules to update a record or add a record.
I have a keys list which is the path I need to update or add
Entry list
[
%{
name: :actor,
opts: [
struct: MishkaDeveloperToolsTest.GuardedStruct.NestedConditionalFieldTest.Actor,
derive: "validate(map, not_empty)",
hint: "001-1-map",
validator: {ConditionalFieldValidatorTestValidators, :is_map_data},
__tag__: "root"
]
},
%{
name: :actor,
opts: [
derive: "sanitize(tag=strip_tags) validate(url, max_len=160)",
hint: "001-2-url",
validator: {ConditionalFieldValidatorTestValidators, :is_string_data},
__tag__: "root"
]
}
]
For example I have a keys list like this ["root", "aa"]
, and I want to add new record to the list
- I need to find is there a list that has
__tag__: "root::aa"
if not add another map to bottom of the list - if it can be found, I need add a map inside
fields
key
When can not find
[
%{
name: :actor,
opts: [
struct: MishkaDeveloperToolsTest.GuardedStruct.NestedConditionalFieldTest.Actor,
derive: "validate(map, not_empty)",
hint: "001-1-map",
validator: {ConditionalFieldValidatorTestValidators, :is_map_data},
__tag__: "root"
]
},
%{
name: :actor,
opts: [
derive: "sanitize(tag=strip_tags) validate(url, max_len=160)",
hint: "001-2-url",
validator: {ConditionalFieldValidatorTestValidators, :is_string_data},
__tag__: "root"
]
},
// add new map last of the list
%{
name: :actor,
opts: [
derive: "sanitize(tag=strip_tags) validate(url, max_len=160)",
hint: "001-2-url",
validator: {ConditionalFieldValidatorTestValidators, :is_string_data},
__tag__: "root:aa"
]
}
]
When we find it
[
%{
name: :actor,
opts: [
struct: MishkaDeveloperToolsTest.GuardedStruct.NestedConditionalFieldTest.Actor,
derive: "validate(map, not_empty)",
hint: "001-1-map",
validator: {ConditionalFieldValidatorTestValidators, :is_map_data},
__tag__: "root"
]
},
%{
name: :actor,
opts: [
derive: "sanitize(tag=strip_tags) validate(url, max_len=160)",
hint: "001-2-url",
validator: {ConditionalFieldValidatorTestValidators, :is_string_data},
__tag__: "root"
]
},
%{
name: :actor,
opts: [
derive: "sanitize(tag=strip_tags) validate(url, max_len=160)",
hint: "001-2-url",
validator: {ConditionalFieldValidatorTestValidators, :is_string_data},
__tag__: "root:aa"
],
// add the map inside fields
fields: [
%{
name: :actor,
opts: [
derive: "sanitize(tag=strip_tags) validate(url, max_len=160)",
hint: "001-2-url",
validator: {ConditionalFieldValidatorTestValidators, :is_string_data},
__tag__: "root:aa"
]
}
]
}
]
As you see I added it inside the last map and add fields keys.
It should be noted the path keys can have 3 or 4 etc items and my code needs to implement none-limit nested map. for example:
__tag__: "root:aa::bb::cc::gg"
["root", "aa", "bb", "cc", "gg"]
Thank you very much for your guidance