// Type aliases, so a consumer can name this library's types without importing
// five packages to write one signature.
//
// Only types and traits: MoonBit does not re-export enum CONSTRUCTORS, so
// `@slack.LayoutBlock` names the type while building one still needs
// `marianoguerra/slack/blocks` in scope. That asymmetry is why the README's
// examples import the packages directly rather than going through here.

///|
pub using @api {
  type ApiResponse,
  type ResponseMetadata,
  type Severity,
  type HttpRequest,
  type HttpResponse,
  type ParamValue,
  type Params,
  type BoolStyle,
  type SlackError,
  trait Transport,
}

///|
pub using @client {type Client, type Paginator}

///|
pub using @blocks {
  type LayoutBlock,
  type BlockElement,
  type TextObject,
  type TextKind,
  type RichTextItem,
  type RichTextBlockElement,
  type UnknownPolicy,
  type BlockParseError,
}

///|
pub using @methods {type RateLimitTier}

///|
/// The high-level client, which answers the types below instead of an
/// envelope. `@typed.Api::of(client)` is how a caller reaches it.
pub using @typed {type Api, type Page, type Posted, type TypedError}

///|
/// The domain model. Unlike the Block Kit types above, these are plain structs
/// with no constructors to lose, so naming one here is the whole of what a
/// consumer needs -- `@slack.User` reads a `users.info` response without
/// importing anything else.
pub using @model {
  type User,
  type Profile,
  type Channel,
  type ChannelText,
  type Message,
  type Edited,
  type Reaction,
  type BotProfile,
  type Team,
  type Usergroup,
  type View,
  type File,
  type Bookmark,
  type ScheduledMessage,
}