// ============================================================================
// 根包是**纯门面**:不含任何实现,只做两类事——
//   1. `pub using` 再导出各子包的公开类型(与工厂函数);
//   2. 让使用者只 import 一个 `@moonhttp` 就拿到全部公开 API。
//
// 实现分布在三个业务子包里(分层依据与完整 DAG 见 `docs/01-architecture.md`):
//   response/    —— 读全量的响应值(`Response`,不抛 `HttpError`)
//   http_error/  —— 纯错误契约(`HttpError` / `ErrorInfo` / `ErrorCode`,不造错误)
//   client/      —— 编排层(`Client`、拦截器、流式响应、重定向、错误构造)
//
// 关于 catch 的写法:`pub using` 能再导出类型,但**再导出不了构造器**
// (当前工具链实测,证据与备选方案见 `docs/01-architecture.md`),所以
// 错误构造器要写类型限定的形式:
//
//   catch { @moonhttp.HttpError::HttpError(info) => ... }
//
// 类型注解(`@moonhttp.HttpError`)、方法调用(`error.code()` 等)与
// `raise @moonhttp.HttpError` 签名都不受影响。凡是出现在公开签名里的类型
// 都在这里再导出一次,因此不会出现「要用这个 API 却不知道类型该从哪 import」。
// 需要精细控制的使用者(例如自己实现 `Transport`)仍可直接依赖对应子包。
// ============================================================================

///|
/// 配置与请求体相关类型:`with_data_from_form` 的入参是 `FormData`,
/// `serialize_body` 的返回值是 `SerializedBody`,流式请求体(docs/20)的载荷
/// 是 `StreamBody`——自定义传输实现按 `RequestBody::Stream` 解构时要用到它。
/// 进度回调的类型同理:`with_on_upload_progress` 的入参是 `ProgressCallback`。
pub using @config {
  type Config,
  type Method,
  type Auth,
  type Proxy,
  type ProxyProtocol,
  type ResponseEncoding,
  type FormData,
  type FormValue,
  type FormFile,
  type SerializedBody,
  type StreamBody,
  type ProgressEvent,
  type ProgressCallback,
}

///|
/// 取消原语:三个入口与七个快捷方法的 `signal?` 参数类型是 `AbortSignal`,
/// 而取消之后调用方还要拿它查状态(`aborted` / `reason`),叫停则要用
/// `AbortController`。信号不是配置字段,所以直接从定义它的 `abort` 包再导出。
pub using @abort {type AbortController, type AbortSignal}

///|
pub using @headers {type Headers}

///|
/// SSE 解析器:它是独立的纯逻辑包,既能被 `Client::sse` 驱动,
/// 也能用在别的字节来源上(文件、WebSocket),是「服务端不声明
/// `text/event-stream` 时自己接」的公开逃生口。
pub using @sse {type SseEvent, type SseParser}

///|
/// 传输层抽象:自定义传输实现是公开的扩展点。
pub using @transport {trait Transport}

///|
/// cookie 罐:`Client::new(cookie_jar~)` 的入参类型。
/// 传入后请求按 URL 自动携带、响应自动存取、过期自动失效,
/// 契约见 `docs/19-cookies.md`。
pub using @cookie {type CookieJar}

///|
/// 响应值与错误契约(定义在 response / http_error 包)。
pub using @response {type Response}

///|
pub using @http_error {type HttpError, type ErrorCode, type ErrorInfo}

///|
/// 编排层:客户端实例、拦截器集合、两个流式类型,以及两段拦截器的
/// 四个函数类型;`create` / `default_client` 两个工厂也随类型一起再导出。
pub using @client {
  type Client,
  type Interceptors,
  type StreamResponse,
  type SseStream,
  type RequestInterceptor,
  type RequestErrorHandler,
  type ResponseInterceptor,
  type ResponseErrorHandler,
  create,
  default_client,
}