///|
/// 分享相关的响应模型。
///
/// Go 侧 `handles.SharingResp` 内嵌 `*model.Sharing`(而 `Sharing` 又内嵌
/// `SharingDB` 与 `model.Sort`),JSON 上全是扁平字段,这里同样摊平。

///|
/// 一条分享记录。
pub struct SharingResponse {
  /// 分享 ID(短字符串)。
  id : String
  /// 过期时间(RFC3339 字符串);永不过期时是 `None`。
  expires : String?
  /// 访问密码。
  pwd : String
  /// 已访问次数。
  accessed : Int
  /// 最大访问次数(0 表示不限)。
  max_accessed : Int
  /// 是否已禁用。
  disabled : Bool
  /// 备注。
  remark : String
  /// 列表页首说明。
  readme : String
  /// 列表页头信息。
  header : String
  /// 排序字段。
  order_by : String
  /// 排序方向(`asc`/`desc`)。
  order_direction : String
  /// 解压策略。
  extract_folder : String
  /// 分享的文件路径列表。
  files : Array[String]
  /// 创建者用户名。
  creator : String
  /// 创建者角色编号。
  creator_role : Int
}

///|
/// 解码分享记录。
pub impl @json.FromJson for SharingResponse with fn from_json(json, path) {
  guard json is Object(fields) else {
    raise @json.JsonDecodeError((path, "SharingResponse: expected object"))
  }
  {
    id: string_field(fields, "id"),
    expires: json_field(fields, "expires"),
    pwd: string_field(fields, "pwd"),
    accessed: int_field(fields, "accessed"),
    max_accessed: int_field(fields, "max_accessed"),
    disabled: bool_field(fields, "disabled"),
    remark: string_field(fields, "remark"),
    readme: string_field(fields, "readme"),
    header: string_field(fields, "header"),
    order_by: string_field(fields, "order_by"),
    order_direction: string_field(fields, "order_direction"),
    extract_folder: string_field(fields, "extract_folder"),
    files: array_field(fields, "files"),
    creator: string_field(fields, "creator"),
    creator_role: int_field(fields, "creator_role"),
  }
}

///|
/// 显式声明手写的 `FromJson` 实现以普通方法暴露。
pub extend SharingResponse with @json.FromJson::{from_json}