"""本模块定义了插件导出的内容对象。

在新版插件系统中，推荐优先使用直接 import 所需要的插件内容。

FrontMatter:
    sidebar_position: 4
    description: nonebot.plugin.export 模块
"""

from . import _current_plugin


class Export(dict):
    """插件导出内容以使得其他插件可以获得。

    用法:
        ```python
        nonebot.export().default = "bar"

        @nonebot.export()
        def some_function():
            pass

        # this doesn't work before python 3.9
        # use
        # export = nonebot.export(); @export.sub
        # instead
        # See also PEP-614: https://www.python.org/dev/peps/pep-0614/
        @nonebot.export().sub
        def something_else():
            pass
        ```
    """

    def __call__(self, func, **kwargs):
        self[func.__name__] = func
        self.update(kwargs)
        return func

    def __setitem__(self, key, value):
        super().__setitem__(key, Export(value) if isinstance(value, dict) else value)

    def __setattr__(self, name, value):
        self[name] = Export(value) if isinstance(value, dict) else value

    def __getattr__(self, name):
        if name not in self:
            self[name] = Export()
        return self[name]


def export() -> Export:
    """获取当前插件的导出内容对象"""
    plugin = _current_plugin.get()
    if not plugin:
        raise RuntimeError("Export outside of the plugin!")
    return plugin.export
