def _iter_request_scopes_by_schema_base()

in src/aaz_dev/cli/controller/az_operation_generator.py [0:0]


def _iter_request_scopes_by_schema_base(schema, name, scope_define, arg_key, cmd_ctx):
    rendered_schemas = []
    search_schemas = {}
    discriminators = []
    if isinstance(schema, CMDObjectSchemaBase):
        if schema.discriminators:
            if schema.additional_props:
                raise NotImplementedError()
            discriminators.extend(schema.discriminators)

        props = schema.props or []
        if isinstance(schema, CMDIdentityObjectSchemaBase) and schema.user_assigned and schema.system_assigned:
            props += [schema.user_assigned, schema.system_assigned]

        if props and schema.additional_props:
            # treat it as AAZFreeFormDictType
            s_name = '{}'
            r_key = '.'  # if element exist, always fill it

            is_const = False
            const_value = None
            rendered_schemas.append(
                (s_name, None, is_const, const_value, r_key, None, None)
            )

        elif props:
            for s in props:
                s_name = s.name
                s_typ, s_typ_kwargs, cls_builder_name = render_schema(s, cmd_ctx.update_clses, s_name)
                if s.arg:
                    # current schema linked with argument
                    s_arg_key, hide = cmd_ctx.get_argument(s.arg)
                    if hide:
                        continue
                else:
                    # current schema not linked with argument, then use current arg_key
                    s_arg_key = arg_key

                # handle enum item attached with argument
                has_enum_argument = False
                if hasattr(s, "enum") and isinstance(s.enum, CMDSchemaEnum):
                    for item in s.enum.items:
                        if item.arg:
                            # enum item linked with argument
                            item_arg_key, hide = cmd_ctx.get_argument(item.arg)
                            if hide:
                                continue
                            has_enum_argument = True
                            r_key = item_arg_key.replace(arg_key, '')
                            if not r_key:
                                r_key = '.'  # which means if the arg exist, fill it
                            is_const = True
                            const_value = item.value
                            rendered_schemas.append(
                                (s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
                            )

                if not has_enum_argument:
                    r_key = s_arg_key.replace(arg_key, '')
                    if not r_key:
                        r_key = '.' if s.required else None  # which means if the parent exist, fill it

                    is_const = False
                    const_value = None
                    if s.const:
                        is_const = True
                        const_value = s.default.value

                    rendered_schemas.append(
                        (s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
                    )
                    if not cls_builder_name and not is_const \
                            and isinstance(s, (CMDObjectSchemaBase, CMDArraySchemaBase)):
                        search_schemas[s_name] = (s, s_arg_key)

        elif schema.additional_props:
            if schema.additional_props.any_type is True:
                s_name = '{}'
                r_key = '.'  # if element exist, always fill it

                is_const = False
                const_value = None
                rendered_schemas.append(
                    (s_name, None, is_const, const_value, r_key, None, None)
                )
            else:
                assert schema.additional_props.item is not None
                s = schema.additional_props.item
                s_name = '{}'
                s_typ, s_typ_kwargs, cls_builder_name = render_schema_base(s, cmd_ctx.update_clses)
                s_arg_key = arg_key + '{}'
                r_key = '.'  # if element exist, always fill it

                is_const = False
                const_value = None
                rendered_schemas.append(
                    (s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
                )
                if not cls_builder_name and isinstance(s, (CMDObjectSchemaBase, CMDArraySchemaBase)):
                    search_schemas[s_name] = (s, s_arg_key)

    elif isinstance(schema, CMDObjectSchemaDiscriminator):
        if schema.discriminators:
            discriminators.extend(schema.discriminators)

        if schema.props:
            for s in schema.props:
                s_name = s.name
                s_typ, s_typ_kwargs, cls_builder_name = render_schema(s, cmd_ctx.update_clses, s_name)
                if s.arg:
                    # current schema linked with argument
                    s_arg_key, hide = cmd_ctx.get_argument(s.arg)
                    if hide:
                        continue
                else:
                    # current schema not linked with argument, then use current arg_key
                    s_arg_key = arg_key

                # handle enum item attached with argument
                has_enum_argument = False
                if hasattr(s, "enum") and isinstance(s.enum, CMDSchemaEnum):
                    for item in s.enum.items:
                        if item.arg:
                            # enum item linked with argument
                            item_arg_key, hide = cmd_ctx.get_argument(item.arg)
                            if hide:
                                continue
                            has_enum_argument = True
                            r_key = item_arg_key.replace(arg_key, '')
                            if not r_key:
                                r_key = '.'
                            is_const = True
                            const_value = item.value
                            rendered_schemas.append(
                                (s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
                            )

                if not has_enum_argument:
                    r_key = s_arg_key.replace(arg_key, '')
                    if not r_key:
                        r_key = '.' if s.required else None

                    is_const = False
                    const_value = None
                    if s.const:
                        is_const = True
                        const_value = s.default.value

                    rendered_schemas.append(
                        (s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
                    )
                    if not cls_builder_name and not is_const \
                            and isinstance(s, (CMDObjectSchemaBase, CMDArraySchemaBase)):
                        # step into object and array schemas
                        search_schemas[s_name] = (s, s_arg_key)

    elif isinstance(schema, CMDArraySchemaBase):
        assert schema.item is not None  # make sure array schema defined its element schema
        s = schema.item
        s_name = '[]'
        s_typ, s_typ_kwargs, cls_builder_name = render_schema_base(s, cmd_ctx.update_clses)
        s_arg_key = arg_key + '[]'
        r_key = '.'  # if element exist, always fill it

        is_const = False
        const_value = None
        rendered_schemas.append(
            (s_name, s_typ, is_const, const_value, r_key, s_typ_kwargs, cls_builder_name)
        )
        if not cls_builder_name and isinstance(s, (CMDObjectSchemaBase, CMDArraySchemaBase)):
            search_schemas[s_name] = (s, s_arg_key)

    else:
        raise NotImplementedError()

    if rendered_schemas or discriminators:
        disc_defines = [(disc.property, disc.value) for disc in discriminators]
        yield name, scope_define, rendered_schemas, disc_defines

    scope_define = scope_define or ""
    for s_name, (s, s_arg_key) in search_schemas.items():
        if s_name == '[]':
            s_scope_define = scope_define + '[]'
            s_name = '_elements'
        elif s_name == '{}':
            s_scope_define = scope_define + '{}'
            s_name = '_elements'
        else:
            s_scope_define = f"{scope_define}.{s_name}"
        for scopes in _iter_request_scopes_by_schema_base(s, to_snake_case(s_name), s_scope_define, s_arg_key, cmd_ctx):
            yield scopes

    for disc in discriminators:
        key_name = disc.property
        key_value = disc.value
        disc_name = f"disc_{to_snake_case(disc.get_safe_value())}"

        disc_scope_define = scope_define + "{" + key_name + ":" + key_value + "}"
        disc_arg_key = arg_key
        for scopes in _iter_request_scopes_by_schema_base(disc, disc_name, disc_scope_define, disc_arg_key, cmd_ctx):
            yield scopes