in src/aaz_dev/swagger/controller/_example_builder.py [0:0]
def build(self, var_prefix, example_obj, disc=None):
example_items = []
if isinstance(example_obj, list):
arg_var = f"{var_prefix}[]"
item = ExampleItem.new_instance(
command=self.command,
cmd_operation=self.cmd_operation,
arg_var=arg_var
)
if item:
discs = item.discriminators
for obj in example_obj:
for disc in discs:
if disc.property not in obj or obj[disc.property] != disc.value:
continue
example_items += self.build(arg_var, obj, disc)
break
else:
example_items += self.build(arg_var, obj)
elif isinstance(example_obj, dict):
disc_name = None
if disc is not None: # handle discriminator
example_obj.pop(disc.property) # ignore discriminator prop
safe_value = self.get_safe_value(disc.value)
disc_item = ExampleItem.new_instance(
command=self.command,
cmd_operation=self.cmd_operation,
arg_var=f"{var_prefix}.{safe_value}"
)
if disc_item and (disc_name := disc_item.arg_option):
example_obj[disc_name] = copy.deepcopy(example_obj) # further trim (polymorphic or not)
example_items += self.build(disc_item.arg_var, example_obj[disc_name])
for name, value in example_obj.copy().items():
if name == disc_name:
continue
item = ExampleItem.new_instance(
command=self.command,
cmd_operation=self.cmd_operation,
arg_var=f"{var_prefix}{{}}.{name}",
key=name,
val=value
)
if not item:
item = ExampleItem.new_instance(
command=self.command,
cmd_operation=self.cmd_operation,
arg_var=f"{var_prefix}.{name}",
key=name,
val=value
)
if item:
example_obj.pop(name) # will push back if arg_var valid
for disc in item.discriminators:
if disc.property not in value or value[disc.property] != disc.value:
continue
example_items += self.build(item.arg_var, value, disc)
break
else:
example_items += self.build(item.arg_var, value)
if item.is_top_level:
example_items.append((item.arg_option, value))
elif item.is_flatten:
for k, v in item.val.items():
example_obj[k] = v
elif item.arg_option:
example_obj[item.arg_option] = item.val
return example_items