# `LibOss.Config.Manager`
[🔗](https://github.com/tt67wq/lib-oss/blob/main/lib/lib_oss/config/manager.ex#L1)

统一的配置管理器，提供配置加载、缓存和运行时更新功能。

该模块负责：
- 从多个来源加载配置（应用配置、环境变量、运行时配置）
- 配置缓存和更新
- 配置变更通知
- 环境特定配置处理

# `config_key`

```elixir
@type config_key() :: atom()
```

# `config_source`

```elixir
@type config_source() :: :app_config | :env_vars | :runtime
```

# `config_value`

```elixir
@type config_value() :: any()
```

# `t`

```elixir
@type t() :: %LibOss.Config.Manager{
  config_cache: map(),
  env: LibOss.Config.Validator.env(),
  module_name: atom(),
  otp_app: atom(),
  subscribers: [pid()]
}
```

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `get_config`

```elixir
@spec get_config(atom(), config_key() | nil) :: any()
```

获取配置。

## 参数

  * `module_name` - 模块名称
  * `key` - 配置键（可选）

## 返回值

  * 配置值或完整配置

# `reload_config`

```elixir
@spec reload_config(atom()) :: :ok | {:error, String.t()}
```

重新加载配置。

## 参数

  * `module_name` - 模块名称

## 返回值

  * `:ok` - 重新加载成功
  * `{:error, reason}` - 重新加载失败

# `start_link`

```elixir
@spec start_link(keyword()) :: GenServer.on_start()
```

启动配置管理器。

## 参数

  * `config` - 包含以下键的配置关键字列表：
    * `:otp_app` - OTP应用名称
    * `:module_name` - 模块名称
    * `:name` - GenServer进程名称（可选）
    * 其他初始化选项

## 返回值

  * `{:ok, pid}` - 启动成功
  * `{:error, reason}` - 启动失败

## 示例

    # 在应用的supervision tree中使用
    defmodule MyApp.Application do
      use Application

      def start(_type, _args) do
        children = [
          {LibOss.Config.Manager, [
            otp_app: :my_app,
            module_name: MyOss,
            name: MyOss.ConfigManager
          ]}
        ]

        Supervisor.start_link(children, strategy: :one_for_one)
      end
    end

    # 或者直接启动
    config = [
      otp_app: :my_app,
      module_name: MyOss,
      name: MyOss.ConfigManager
    ]
    {:ok, pid} = LibOss.Config.Manager.start_link(config)

# `start_link`

```elixir
@spec start_link(atom(), atom(), keyword()) :: GenServer.on_start()
```

启动配置管理器的便利函数（保持向后兼容）。

## 参数

  * `otp_app` - OTP应用名称
  * `module_name` - 模块名称
  * `opts` - 启动选项

## 返回值

  * `{:ok, pid}` - 启动成功
  * `{:error, reason}` - 启动失败

# `subscribe`

```elixir
@spec subscribe(atom(), pid()) :: :ok
```

订阅配置变更通知。

## 参数

  * `module_name` - 模块名称
  * `subscriber` - 订阅者进程

## 返回值

  * `:ok` - 订阅成功

# `unsubscribe`

```elixir
@spec unsubscribe(atom(), pid()) :: :ok
```

取消订阅配置变更通知。

## 参数

  * `module_name` - 模块名称
  * `subscriber` - 订阅者进程

## 返回值

  * `:ok` - 取消订阅成功

# `update_config`

```elixir
@spec update_config(
  atom(),
  keyword()
) :: :ok | {:error, String.t()}
```

更新配置。

## 参数

  * `module_name` - 模块名称
  * `config` - 新配置

## 返回值

  * `:ok` - 更新成功
  * `{:error, reason}` - 更新失败

---

*Consult [api-reference.md](api-reference.md) for complete listing*
