def flatten_arg()

in src/aaz_dev/command/controller/workspace_cfg_editor.py [0:0]


    def flatten_arg(self, *cmd_names, arg_var, sub_args_options=None):
        command = self.find_command(*cmd_names)
        parent, arg, _ = self.find_arg_with_parent_by_var(*cmd_names, arg_var=arg_var)
        if not arg:
            raise exceptions.InvalidAPIUsage(
                f"Argument not exist: {arg.var}")
        assert parent is not None

        need_unwrap = False
        if isinstance(arg, CMDClsArg) and isinstance(arg.implement, CMDObjectArg):
            if arg.implement.additional_props:
                raise exceptions.InvalidAPIUsage(f"Cannot flatten argument with additional properties")
            need_unwrap = True
        elif isinstance(arg, CMDObjectArg):
            if arg.additional_props:
                raise exceptions.InvalidAPIUsage(f"Cannot flatten argument with additional properties")
            if arg.cls:
                need_unwrap = True
        else:
            raise exceptions.InvalidAPIUsage(f"Cannot flatten argument in type: '{type(arg)}'")

        if need_unwrap:
            # unwrap cls argument first
            self.unwrap_cls_arg(*cmd_names, arg_var=arg_var)
            command = self.find_command(*cmd_names)
            parent, arg, _ = self.find_arg_with_parent_by_var(*cmd_names, arg_var=arg_var)
            assert arg and parent

        parent.args.remove(arg)

        used_options = set()
        if isinstance(parent, CMDArgGroup):
            for group in command.arg_groups:
                for a in group.args:
                    used_options.update(a.options)
        else:
            for a in parent.args:
                used_options.update(a.options)

        for sub_arg in arg.args:
            if sub_args_options and sub_arg.var in sub_args_options:
                sub_arg.options = sub_args_options[sub_arg.var]
            # verify duplicated option
            for option in sub_arg.options:
                if option in used_options:
                    raise exceptions.VerificationError(
                        message=f"Argument option '{option}' duplicated.",
                        details={
                            "type": "Argument",
                            "options": sub_arg.options,
                            "var": sub_arg.var,
                        }
                    )
                used_options.add(option)

            sub_arg.group = to_camel_case(arg.options[0])
            sub_arg.hide = sub_arg.hide or arg.hide  # inherient the hide property from the parent arguments
            parent.args.append(sub_arg)

        # regenerate args and its relationship with schema
        command.generate_args()
        self.reformat()