def _iter_sub_schema()

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


    def _iter_sub_schema(cls, parent, schema_filter):
        if isinstance(parent, CMDObjectSchemaBase):
            if parent.props:
                for prop in parent.props:
                    match, ret = schema_filter(parent, prop, [prop.name])
                    if match:
                        yield match
                    if ret:
                        return

                    # if isinstance(prop, (CMDObjectSchemaBase, CMDArraySchemaBase)):
                    for sub_parent, sub_schema, sub_schema_idx in cls._iter_sub_schema(prop, schema_filter):
                        if sub_schema:
                            sub_schema_idx = [prop.name, *sub_schema_idx]
                        yield sub_parent, sub_schema, sub_schema_idx

            if parent.additional_props and parent.additional_props.item:
                item = parent.additional_props.item
                match, ret = schema_filter(parent, item, ['{}'])
                if match:
                    yield match
                if ret:
                    return

                for sub_parent, sub_schema, sub_schema_idx in cls._iter_sub_schema(item, schema_filter):
                    if sub_schema:
                        sub_schema_idx = ['{}', *sub_schema_idx]
                    yield sub_parent, sub_schema, sub_schema_idx

            if parent.discriminators:
                for disc in parent.discriminators:
                    for sub_parent, sub_schema, sub_schema_idx in cls._iter_sub_schema(disc, schema_filter):
                        if sub_schema:
                            sub_schema_idx = [disc.get_safe_value(), *sub_schema_idx]
                        yield sub_parent, sub_schema, sub_schema_idx

        elif isinstance(parent, CMDObjectSchemaDiscriminator):
            if parent.props:
                for prop in parent.props:
                    match, ret = schema_filter(parent, prop, [prop.name])
                    if match:
                        yield match
                    if ret:
                        return

                    # if isinstance(prop, (CMDObjectSchemaBase, CMDArraySchemaBase)):
                    for sub_parent, sub_schema, sub_schema_idx in cls._iter_sub_schema(prop, schema_filter):
                        if sub_schema:
                            sub_schema_idx = [prop.name, *sub_schema_idx]
                        yield sub_parent, sub_schema, sub_schema_idx

            if parent.discriminators:
                for disc in parent.discriminators:
                    for sub_parent, sub_schema, sub_schema_idx in cls._iter_sub_schema(disc, schema_filter):
                        if sub_schema:
                            sub_schema_idx = [disc.get_safe_value(), *sub_schema_idx]
                        yield sub_parent, sub_schema, sub_schema_idx

        elif isinstance(parent, CMDArraySchemaBase):
            item = parent.item
            match, ret = schema_filter(parent, item, ['[]'])
            if match:
                yield match
            if ret:
                return

            for sub_parent, sub_schema, sub_schema_idx in cls._iter_sub_schema(item, schema_filter):
                if sub_schema:
                    sub_schema_idx = ['[]', *sub_schema_idx]
                yield sub_parent, sub_schema, sub_schema_idx