///|
/// 分享域的请求模型。
///
/// 服务端 `handles.UpdateSharingReq` 同时服务 `create` 与 `update`,这里保持一致:
///
/// - 可空字段留空时会以 `null` 发出去,服务端对 `null` 取零值(字符串空串、
///   数值 0、布尔假、时间指针 nil),与我们想要的「不设置」完全等价;
/// - 服务端会忽略它不认识的字段,所以这里比服务端多/少一个字段都不会出错,但
///   反之我们自己也不能依赖多发的字段生效。
pub struct SharingUpdateRequest {
  /// 要分享的路径列表,至少一项;空列表服务端会报 400。
  files : Array[String]
  /// 过期时间,RFC3339 字符串;不设置表示永不过期。
  expires : String?
  /// 访问密码;空表示不需要密码。
  pwd : String?
  /// 最大访问次数,0 表示不限。
  max_accessed : Int?
  /// 是否禁用。
  disabled : Bool?
  /// 备注。
  remark : String?
  /// 分享列表页的说明。
  readme : String?
  /// 分享列表页的头部信息。
  header : String?
  /// 排序字段。
  order_by : String?
  /// 排序方向(`asc`/`desc`)。
  order_direction : String?
  /// 解压策略(枚举字符串,取值以服务端为准)。
  extract_folder : String?
  /// 创建者用户名:只有管理员能指定,普通用户会被忽略。
  creator : String?
  /// 已访问次数(一般不用设置)。
  accessed : Int?
  /// 分享 ID。`create` 时给值表示自定义 ID(需要相应权限);`update` 时必填。
  id : String?
  /// 变更后的分享 ID:`update` 时非空表示改 ID(需要相应权限)。
  new_id : String?
} derive(ToJson)

///|
/// 显式声明 `derive` 出来的 `ToJson` 实现以普通方法暴露。
pub extend SharingUpdateRequest with ToJson::{to_json}

///|
/// 构造分享请求:`files` 必填,其余按需给。
///
/// 结构体字段本身也是公开的,需要在此函数之外微调时可以直接改(或配合
/// `{ ..request, pwd: Some("x") }` 做函数式更新)。
pub fn SharingUpdateRequest::new(
  files : Array[String],
  expires? : String,
  pwd? : String,
  max_accessed? : Int,
  disabled? : Bool,
  remark? : String,
  readme? : String,
  header? : String,
  order_by? : String,
  order_direction? : String,
  extract_folder? : String,
  creator? : String,
  accessed? : Int,
  id? : String,
  new_id? : String,
) -> SharingUpdateRequest {
  {
    files,
    expires,
    pwd,
    max_accessed,
    disabled,
    remark,
    readme,
    header,
    order_by,
    order_direction,
    extract_folder,
    creator,
    accessed,
    id,
    new_id,
  }
}