type snowflake = abstract type user = abstract type group = { id: snowflake; ?last_message_id: snowflake option; ?last_pin_timestamp: string option; ?icon: string option; ?name: string option; owner_id: snowflake; recipients: user list; } type dm = { id: snowflake; ?last_message_id: snowflake option; ?last_pin_timestamp: string option; } type guild_text = { id: snowflake; ?last_message_id: snowflake option; ?last_pin_timestamp: string option; ?category_id : snowflake option; guild_id: snowflake; name: string; position: int; ?topic: string option; nsfw: bool; ?slow_mode_timeout : int option; } type guild_voice = { id: snowflake; ?category_id : snowflake option; guild_id: snowflake; name: string; position: int; ?topic: string option; nsfw: bool; ?user_limit: int option; ?bitrate: int option; } type category = { id: snowflake; ?category_id : snowflake option; position: int; name: string; nsfw: bool; } type t = [ Group of group | Private of dm | GuildText of guild_text | GuildVoice of guild_voice | Category of category ] type channel_wrapper = { id: snowflake; kind : int; ?guild_id: snowflake option; ?position: int option; ?name: string option; ?topic: string option; ?nsfw: bool option; ?last_message_id: snowflake option; ?bitrate: int option; ?user_limit: int option; ?rate_limit_per_user: int option; ?recipients: user list option; ?icon: string option; ?owner_id: snowflake option; ?application_id: snowflake option; ?category_id : snowflake option; ?last_pin_timestamp: string option; }