# `LibOss.Core.Tagging`
[🔗](https://github.com/tt67wq/lib-oss/blob/main/lib/lib_oss/core/tagging.ex#L1)

标签管理模块

负责：
- 对象标签：put_object_tagging, get_object_tagging, delete_object_tagging
- 标签验证和处理

# `err_t`

```elixir
@type err_t() :: {:error, LibOss.Exception.t()}
```

# `delete_object_tagging`

```elixir
@spec delete_object_tagging(
  module(),
  LibOss.Typespecs.bucket(),
  LibOss.Typespecs.object()
) ::
  :ok | err_t()
```

删除对象标签

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称

## 返回值
- :ok | {:error, Exception.t()}

## 示例
    iex> LibOss.Core.Tagging.delete_object_tagging(MyOss, "my-bucket", "my-object")
    :ok

## 相关文档
https://help.aliyun.com/document_detail/114878.html

# `get_object_tagging`

```elixir
@spec get_object_tagging(
  module(),
  LibOss.Typespecs.bucket(),
  LibOss.Typespecs.object()
) ::
  {:ok, [map()]} | err_t()
```

获取对象标签

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称

## 返回值
- `{:ok, [map()]} | {:error, Exception.t()}`

返回标签列表，每个标签包含key和value字段

## 示例
    iex> LibOss.Core.Tagging.get_object_tagging(MyOss, "my-bucket", "my-object")
    {:ok, [%{key: "env", value: "prod"}, %{key: "team", value: "backend"}]}

## 相关文档
https://help.aliyun.com/document_detail/114878.html

# `get_tag_count`

```elixir
@spec get_tag_count(module(), LibOss.Typespecs.bucket(), LibOss.Typespecs.object()) ::
  {:ok, non_neg_integer()} | err_t()
```

获取对象标签数量

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称

## 返回值
- `{:ok, non_neg_integer()} | {:error, Exception.t()}`

## 示例
    iex> LibOss.Core.Tagging.get_tag_count(MyOss, "my-bucket", "my-object")
    {:ok, 2}

# `has_tags?`

```elixir
@spec has_tags?(module(), LibOss.Typespecs.bucket(), LibOss.Typespecs.object()) ::
  boolean()
```

检查对象是否有标签

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称

## 返回值
- boolean()

## 示例
    iex> LibOss.Core.Tagging.has_tags?(MyOss, "my-bucket", "my-object")
    true

# `put_object_tagging`

```elixir
@spec put_object_tagging(
  module(),
  LibOss.Typespecs.bucket(),
  LibOss.Typespecs.object(),
  LibOss.Typespecs.dict() | keyword()
) :: :ok | err_t()
```

设置对象标签

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称
- tags: 标签map或关键字列表

## 标签限制
- 最多10个标签
- 标签键最长128字符
- 标签值最长256字符

## 返回值
- :ok | {:error, Exception.t()}

## 示例
    iex> LibOss.Core.Tagging.put_object_tagging(MyOss, "my-bucket", "my-object", %{"env" => "prod", "team" => "backend"})
    :ok

    iex> LibOss.Core.Tagging.put_object_tagging(MyOss, "my-bucket", "my-object", [{"env", "prod"}, {"team", "backend"}])
    :ok

## 相关文档
https://help.aliyun.com/document_detail/114878.html

# `tag_limits`

```elixir
@spec tag_limits() :: map()
```

获取标签限制信息

## 返回值
- map()

## 示例
    iex> LibOss.Core.Tagging.tag_limits()
    %{
      max_tags: 10,
      max_key_length: 128,
      max_value_length: 256
    }

# `update_object_tagging`

```elixir
@spec update_object_tagging(
  module(),
  LibOss.Typespecs.bucket(),
  LibOss.Typespecs.object(),
  LibOss.Typespecs.dict() | keyword()
) :: :ok | err_t()
```

更新对象标签（合并现有标签）

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称
- new_tags: 新的标签map或关键字列表

## 返回值
- :ok | {:error, Exception.t()}

该函数会先获取现有标签，然后与新标签合并后更新

## 示例
    iex> LibOss.Core.Tagging.update_object_tagging(MyOss, "my-bucket", "my-object", %{"version" => "1.0"})
    :ok

# `validate_tags`

```elixir
@spec validate_tags(LibOss.Typespecs.dict() | keyword()) ::
  :ok | {:error, LibOss.Exception.t()}
```

验证标签是否符合OSS规范

## 参数
- tags: 标签map或关键字列表

## 返回值
- :ok | {:error, Exception.t()}

## 验证规则
- 标签数量不超过10个
- 标签键长度不超过128字符
- 标签值长度不超过256字符
- 标签键不能为空

## 示例
    iex> LibOss.Core.Tagging.validate_tags(%{"key1" => "value1"})
    :ok

    iex> LibOss.Core.Tagging.validate_tags(%{})
    :ok

---

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