///|
/// Represents a chat member that owns the chat and has all administrator privileges.
pub struct ChatMemberOwner {
  user : User
  is_anonymous : Bool
  custom_title : String?
} derive(Show, Eq)

///|
/// Creates a new [ChatMemberOwner].
pub fn ChatMemberOwner::new(
  user~ : User,
  is_anonymous~ : Bool,
  custom_title? : String,
) -> ChatMemberOwner {
  { user, is_anonymous, custom_title }
}

///|
/// Represents a chat member that has some additional privileges.
pub struct ChatMemberAdministrator {
  user : User
  can_be_edited : Bool
  is_anonymous : Bool
  can_manage_chat : Bool
  can_delete_messages : Bool
  can_manage_video_chats : Bool
  can_restrict_members : Bool
  can_promote_members : Bool
  can_change_info : Bool
  can_invite_users : Bool
  can_post_stories : Bool
  can_edit_stories : Bool
  can_delete_stories : Bool
  can_post_messages : Bool?
  can_edit_messages : Bool?
  can_pin_messages : Bool?
  can_manage_topics : Bool?
  custom_title : String?
} derive(Show, Eq)

///|
/// Creates a new [ChatMemberAdministrator].
pub fn ChatMemberAdministrator::new(
  user~ : User,
  can_be_edited~ : Bool,
  is_anonymous~ : Bool,
  can_manage_chat~ : Bool,
  can_delete_messages~ : Bool,
  can_manage_video_chats~ : Bool,
  can_restrict_members~ : Bool,
  can_promote_members~ : Bool,
  can_change_info~ : Bool,
  can_invite_users~ : Bool,
  can_post_stories~ : Bool,
  can_edit_stories~ : Bool,
  can_delete_stories~ : Bool,
  can_post_messages? : Bool,
  can_edit_messages? : Bool,
  can_pin_messages? : Bool,
  can_manage_topics? : Bool,
  custom_title? : String,
) -> ChatMemberAdministrator {
  {
    user,
    can_be_edited,
    is_anonymous,
    can_manage_chat,
    can_delete_messages,
    can_manage_video_chats,
    can_restrict_members,
    can_promote_members,
    can_change_info,
    can_invite_users,
    can_post_stories,
    can_edit_stories,
    can_delete_stories,
    can_post_messages,
    can_edit_messages,
    can_pin_messages,
    can_manage_topics,
    custom_title,
  }
}

///|
/// Represents a chat member that has no additional privileges or restrictions.
pub struct ChatMemberMember {
  user : User
  until_date : Int?
} derive(Show, Eq)

///|
/// Creates a new [ChatMemberMember].
pub fn ChatMemberMember::new(
  user~ : User,
  until_date? : Int,
) -> ChatMemberMember {
  { user, until_date }
}

///|
/// Represents a chat member that is under certain restrictions in the chat. Supergroups only.
pub struct ChatMemberRestricted {
  user : User
  is_member : Bool
  can_send_messages : Bool
  can_send_audios : Bool
  can_send_documents : Bool
  can_send_photos : Bool
  can_send_videos : Bool
  can_send_video_notes : Bool
  can_send_voice_notes : Bool
  can_send_polls : Bool
  can_send_other_messages : Bool
  can_add_web_page_previews : Bool
  can_change_info : Bool
  can_invite_users : Bool
  can_pin_messages : Bool
  can_manage_topics : Bool
  until_date : Int
} derive(Show, Eq)

///|
/// Creates a new [ChatMemberRestricted].
pub fn ChatMemberRestricted::new(
  user~ : User,
  is_member~ : Bool,
  can_send_messages~ : Bool,
  can_send_audios~ : Bool,
  can_send_documents~ : Bool,
  can_send_photos~ : Bool,
  can_send_videos~ : Bool,
  can_send_video_notes~ : Bool,
  can_send_voice_notes~ : Bool,
  can_send_polls~ : Bool,
  can_send_other_messages~ : Bool,
  can_add_web_page_previews~ : Bool,
  can_change_info~ : Bool,
  can_invite_users~ : Bool,
  can_pin_messages~ : Bool,
  can_manage_topics~ : Bool,
  until_date~ : Int,
) -> ChatMemberRestricted {
  {
    user,
    is_member,
    can_send_messages,
    can_send_audios,
    can_send_documents,
    can_send_photos,
    can_send_videos,
    can_send_video_notes,
    can_send_voice_notes,
    can_send_polls,
    can_send_other_messages,
    can_add_web_page_previews,
    can_change_info,
    can_invite_users,
    can_pin_messages,
    can_manage_topics,
    until_date,
  }
}

///|
/// Represents a chat member that isn't currently a member of the chat but may join it themselves.
pub struct ChatMemberLeft {
  user : User
} derive(Show, Eq)

///|
/// Creates a new [ChatMemberLeft].
pub fn ChatMemberLeft::new(user~ : User) -> ChatMemberLeft {
  { user, }
}

///|
/// Represents a chat member that was banned in the chat and can't return to the
/// chat or view chat messages.
pub struct ChatMemberBanned {
  user : User
  until_date : Int
} derive(Show, Eq)

///|
/// Creates a new [ChatMemberBanned].
pub fn ChatMemberBanned::new(
  user~ : User,
  until_date~ : Int,
) -> ChatMemberBanned {
  { user, until_date }
}

///|
/// This object contains information about one member of a chat.
pub(all) enum ChatMember {
  Owner(ChatMemberOwner)
  Administrator(ChatMemberAdministrator)
  Member(ChatMemberMember)
  Restricted(ChatMemberRestricted)
  Left(ChatMemberLeft)
  Banned(ChatMemberBanned)
} derive(Show, Eq)

///|
pub impl ToJson for ChatMember with to_json(self) {
  match self {
    Owner(v) => {
      let object : Map[String, Json] = {
        "status": "creator".to_json(),
        "user": v.user.to_json(),
        "is_anonymous": v.is_anonymous.to_json(),
      }
      if v.custom_title is Some(t) {
        object["custom_title"] = t.to_json()
      }
      object.to_json()
    }
    Administrator(v) => {
      let object : Map[String, Json] = {
        "status": "administrator".to_json(),
        "user": v.user.to_json(),
        "can_be_edited": v.can_be_edited.to_json(),
        "is_anonymous": v.is_anonymous.to_json(),
        "can_manage_chat": v.can_manage_chat.to_json(),
        "can_delete_messages": v.can_delete_messages.to_json(),
        "can_manage_video_chats": v.can_manage_video_chats.to_json(),
        "can_restrict_members": v.can_restrict_members.to_json(),
        "can_promote_members": v.can_promote_members.to_json(),
        "can_change_info": v.can_change_info.to_json(),
        "can_invite_users": v.can_invite_users.to_json(),
        "can_post_stories": v.can_post_stories.to_json(),
        "can_edit_stories": v.can_edit_stories.to_json(),
        "can_delete_stories": v.can_delete_stories.to_json(),
      }
      if v.can_post_messages is Some(x) {
        object["can_post_messages"] = x.to_json()
      }
      if v.can_edit_messages is Some(x) {
        object["can_edit_messages"] = x.to_json()
      }
      if v.can_pin_messages is Some(x) {
        object["can_pin_messages"] = x.to_json()
      }
      if v.can_manage_topics is Some(x) {
        object["can_manage_topics"] = x.to_json()
      }
      if v.custom_title is Some(t) {
        object["custom_title"] = t.to_json()
      }
      object.to_json()
    }
    Member(v) => {
      let object : Map[String, Json] = {
        "status": "member".to_json(),
        "user": v.user.to_json(),
      }
      if v.until_date is Some(d) {
        object["until_date"] = d.to_json()
      }
      object.to_json()
    }
    Restricted(v) => {
      let object : Map[String, Json] = {
        "status": "restricted".to_json(),
        "user": v.user.to_json(),
        "is_member": v.is_member.to_json(),
        "can_send_messages": v.can_send_messages.to_json(),
        "can_send_audios": v.can_send_audios.to_json(),
        "can_send_documents": v.can_send_documents.to_json(),
        "can_send_photos": v.can_send_photos.to_json(),
        "can_send_videos": v.can_send_videos.to_json(),
        "can_send_video_notes": v.can_send_video_notes.to_json(),
        "can_send_voice_notes": v.can_send_voice_notes.to_json(),
        "can_send_polls": v.can_send_polls.to_json(),
        "can_send_other_messages": v.can_send_other_messages.to_json(),
        "can_add_web_page_previews": v.can_add_web_page_previews.to_json(),
        "can_change_info": v.can_change_info.to_json(),
        "can_invite_users": v.can_invite_users.to_json(),
        "can_pin_messages": v.can_pin_messages.to_json(),
        "can_manage_topics": v.can_manage_topics.to_json(),
        "until_date": v.until_date.to_json(),
      }
      object.to_json()
    }
    Left(v) => {
      let object : Map[String, Json] = {
        "status": "left".to_json(),
        "user": v.user.to_json(),
      }
      object.to_json()
    }
    Banned(v) => {
      let object : Map[String, Json] = {
        "status": "kicked".to_json(),
        "user": v.user.to_json(),
        "until_date": v.until_date.to_json(),
      }
      object.to_json()
    }
  }
}

///|
pub impl @json.FromJson for ChatMember with from_json(json, path) {
  guard json is Object(object) else {
    raise @json.JsonDecodeError((path, "Expected object for ChatMember"))
  }
  guard object["status"] is String(status) else {
    raise @json.JsonDecodeError((path, "Expected status field"))
  }
  match status {
    "creator" => {
      let user : User = @json.from_json(object["user"], path~)
      let is_anonymous : Bool = @json.from_json(object["is_anonymous"], path~)
      let custom_title : String? = if object.get("custom_title") is Some(v) {
        Some(@json.from_json(v, path~))
      } else {
        None
      }
      Owner(ChatMemberOwner::new(user~, is_anonymous~, custom_title?))
    }
    "administrator" => {
      let user : User = @json.from_json(object["user"], path~)
      let can_be_edited : Bool = @json.from_json(object["can_be_edited"], path~)
      let is_anonymous : Bool = @json.from_json(object["is_anonymous"], path~)
      let can_manage_chat : Bool = @json.from_json(
        object["can_manage_chat"],
        path~,
      )
      let can_delete_messages : Bool = @json.from_json(
        object["can_delete_messages"],
        path~,
      )
      let can_manage_video_chats : Bool = @json.from_json(
        object["can_manage_video_chats"],
        path~,
      )
      let can_restrict_members : Bool = @json.from_json(
        object["can_restrict_members"],
        path~,
      )
      let can_promote_members : Bool = @json.from_json(
        object["can_promote_members"],
        path~,
      )
      let can_change_info : Bool = @json.from_json(
        object["can_change_info"],
        path~,
      )
      let can_invite_users : Bool = @json.from_json(
        object["can_invite_users"],
        path~,
      )
      let can_post_stories : Bool = @json.from_json(
        object["can_post_stories"],
        path~,
      )
      let can_edit_stories : Bool = @json.from_json(
        object["can_edit_stories"],
        path~,
      )
      let can_delete_stories : Bool = @json.from_json(
        object["can_delete_stories"],
        path~,
      )
      let can_post_messages : Bool? = if object.get("can_post_messages")
        is Some(v) {
        Some(@json.from_json(v, path~))
      } else {
        None
      }
      let can_edit_messages : Bool? = if object.get("can_edit_messages")
        is Some(v) {
        Some(@json.from_json(v, path~))
      } else {
        None
      }
      let can_pin_messages : Bool? = if object.get("can_pin_messages")
        is Some(v) {
        Some(@json.from_json(v, path~))
      } else {
        None
      }
      let can_manage_topics : Bool? = if object.get("can_manage_topics")
        is Some(v) {
        Some(@json.from_json(v, path~))
      } else {
        None
      }
      let custom_title : String? = if object.get("custom_title") is Some(v) {
        Some(@json.from_json(v, path~))
      } else {
        None
      }
      Administrator(
        ChatMemberAdministrator::new(
          user~,
          can_be_edited~,
          is_anonymous~,
          can_manage_chat~,
          can_delete_messages~,
          can_manage_video_chats~,
          can_restrict_members~,
          can_promote_members~,
          can_change_info~,
          can_invite_users~,
          can_post_stories~,
          can_edit_stories~,
          can_delete_stories~,
          can_post_messages?,
          can_edit_messages?,
          can_pin_messages?,
          can_manage_topics?,
          custom_title?,
        ),
      )
    }
    "member" => {
      let user : User = @json.from_json(object["user"], path~)
      let until_date : Int? = if object.get("until_date") is Some(v) {
        Some(@json.from_json(v, path~))
      } else {
        None
      }
      Member(ChatMemberMember::new(user~, until_date?))
    }
    "restricted" => {
      let user : User = @json.from_json(object["user"], path~)
      let is_member : Bool = @json.from_json(object["is_member"], path~)
      let can_send_messages : Bool = @json.from_json(
        object["can_send_messages"],
        path~,
      )
      let can_send_audios : Bool = @json.from_json(
        object["can_send_audios"],
        path~,
      )
      let can_send_documents : Bool = @json.from_json(
        object["can_send_documents"],
        path~,
      )
      let can_send_photos : Bool = @json.from_json(
        object["can_send_photos"],
        path~,
      )
      let can_send_videos : Bool = @json.from_json(
        object["can_send_videos"],
        path~,
      )
      let can_send_video_notes : Bool = @json.from_json(
        object["can_send_video_notes"],
        path~,
      )
      let can_send_voice_notes : Bool = @json.from_json(
        object["can_send_voice_notes"],
        path~,
      )
      let can_send_polls : Bool = @json.from_json(
        object["can_send_polls"],
        path~,
      )
      let can_send_other_messages : Bool = @json.from_json(
        object["can_send_other_messages"],
        path~,
      )
      let can_add_web_page_previews : Bool = @json.from_json(
        object["can_add_web_page_previews"],
        path~,
      )
      let can_change_info : Bool = @json.from_json(
        object["can_change_info"],
        path~,
      )
      let can_invite_users : Bool = @json.from_json(
        object["can_invite_users"],
        path~,
      )
      let can_pin_messages : Bool = @json.from_json(
        object["can_pin_messages"],
        path~,
      )
      let can_manage_topics : Bool = @json.from_json(
        object["can_manage_topics"],
        path~,
      )
      let until_date : Int = @json.from_json(object["until_date"], path~)
      Restricted(
        ChatMemberRestricted::new(
          user~,
          is_member~,
          can_send_messages~,
          can_send_audios~,
          can_send_documents~,
          can_send_photos~,
          can_send_videos~,
          can_send_video_notes~,
          can_send_voice_notes~,
          can_send_polls~,
          can_send_other_messages~,
          can_add_web_page_previews~,
          can_change_info~,
          can_invite_users~,
          can_pin_messages~,
          can_manage_topics~,
          until_date~,
        ),
      )
    }
    "left" => {
      let user : User = @json.from_json(object["user"], path~)
      Left(ChatMemberLeft::new(user~))
    }
    "kicked" => {
      let user : User = @json.from_json(object["user"], path~)
      let until_date : Int = @json.from_json(object["until_date"], path~)
      Banned(ChatMemberBanned::new(user~, until_date~))
    }
    _ =>
      raise @json.JsonDecodeError(
        (path, "Unknown ChatMember status: " + status),
      )
  }
}

///|
/// Describes actions that a non-administrator user is allowed to take in a chat.
pub struct ChatPermissions {
  can_send_messages : Bool?
  can_send_audios : Bool?
  can_send_documents : Bool?
  can_send_photos : Bool?
  can_send_videos : Bool?
  can_send_video_notes : Bool?
  can_send_voice_notes : Bool?
  can_send_polls : Bool?
  can_send_other_messages : Bool?
  can_add_web_page_previews : Bool?
  can_change_info : Bool?
  can_invite_users : Bool?
  can_pin_messages : Bool?
  can_manage_topics : Bool?
} derive(Show, Eq)

///|
/// Creates a new [ChatPermissions].
pub fn ChatPermissions::new(
  can_send_messages? : Bool,
  can_send_audios? : Bool,
  can_send_documents? : Bool,
  can_send_photos? : Bool,
  can_send_videos? : Bool,
  can_send_video_notes? : Bool,
  can_send_voice_notes? : Bool,
  can_send_polls? : Bool,
  can_send_other_messages? : Bool,
  can_add_web_page_previews? : Bool,
  can_change_info? : Bool,
  can_invite_users? : Bool,
  can_pin_messages? : Bool,
  can_manage_topics? : Bool,
) -> ChatPermissions {
  {
    can_send_messages,
    can_send_audios,
    can_send_documents,
    can_send_photos,
    can_send_videos,
    can_send_video_notes,
    can_send_voice_notes,
    can_send_polls,
    can_send_other_messages,
    can_add_web_page_previews,
    can_change_info,
    can_invite_users,
    can_pin_messages,
    can_manage_topics,
  }
}

///|
pub impl ToJson for ChatPermissions with to_json(self) {
  let object : Map[String, Json] = {}
  if self.can_send_messages is Some(v) {
    object["can_send_messages"] = v.to_json()
  }
  if self.can_send_audios is Some(v) {
    object["can_send_audios"] = v.to_json()
  }
  if self.can_send_documents is Some(v) {
    object["can_send_documents"] = v.to_json()
  }
  if self.can_send_photos is Some(v) {
    object["can_send_photos"] = v.to_json()
  }
  if self.can_send_videos is Some(v) {
    object["can_send_videos"] = v.to_json()
  }
  if self.can_send_video_notes is Some(v) {
    object["can_send_video_notes"] = v.to_json()
  }
  if self.can_send_voice_notes is Some(v) {
    object["can_send_voice_notes"] = v.to_json()
  }
  if self.can_send_polls is Some(v) {
    object["can_send_polls"] = v.to_json()
  }
  if self.can_send_other_messages is Some(v) {
    object["can_send_other_messages"] = v.to_json()
  }
  if self.can_add_web_page_previews is Some(v) {
    object["can_add_web_page_previews"] = v.to_json()
  }
  if self.can_change_info is Some(v) {
    object["can_change_info"] = v.to_json()
  }
  if self.can_invite_users is Some(v) {
    object["can_invite_users"] = v.to_json()
  }
  if self.can_pin_messages is Some(v) {
    object["can_pin_messages"] = v.to_json()
  }
  if self.can_manage_topics is Some(v) {
    object["can_manage_topics"] = v.to_json()
  }
  object.to_json()
}

///|
pub impl @json.FromJson for ChatPermissions with from_json(json, path) {
  guard json is Object(object) else {
    raise @json.JsonDecodeError((path, "Expected object for ChatPermissions"))
  }
  let can_send_messages : Bool? = if object.get("can_send_messages") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_send_audios : Bool? = if object.get("can_send_audios") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_send_documents : Bool? = if object.get("can_send_documents")
    is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_send_photos : Bool? = if object.get("can_send_photos") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_send_videos : Bool? = if object.get("can_send_videos") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_send_video_notes : Bool? = if object.get("can_send_video_notes")
    is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_send_voice_notes : Bool? = if object.get("can_send_voice_notes")
    is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_send_polls : Bool? = if object.get("can_send_polls") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_send_other_messages : Bool? = if object.get("can_send_other_messages")
    is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_add_web_page_previews : Bool? = if object.get(
      "can_add_web_page_previews",
    )
    is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_change_info : Bool? = if object.get("can_change_info") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_invite_users : Bool? = if object.get("can_invite_users") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_pin_messages : Bool? = if object.get("can_pin_messages") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_manage_topics : Bool? = if object.get("can_manage_topics") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  {
    can_send_messages,
    can_send_audios,
    can_send_documents,
    can_send_photos,
    can_send_videos,
    can_send_video_notes,
    can_send_voice_notes,
    can_send_polls,
    can_send_other_messages,
    can_add_web_page_previews,
    can_change_info,
    can_invite_users,
    can_pin_messages,
    can_manage_topics,
  }
}

///|
/// Represents the rights of an administrator in a chat.
pub struct ChatAdministratorRights {
  is_anonymous : Bool
  can_manage_chat : Bool
  can_delete_messages : Bool
  can_manage_video_chats : Bool
  can_restrict_members : Bool
  can_promote_members : Bool
  can_change_info : Bool
  can_invite_users : Bool
  can_post_stories : Bool
  can_edit_stories : Bool
  can_delete_stories : Bool
  can_post_messages : Bool?
  can_edit_messages : Bool?
  can_pin_messages : Bool?
  can_manage_topics : Bool?
} derive(Show, Eq)

///|
/// Creates a new [ChatAdministratorRights].
pub fn ChatAdministratorRights::new(
  is_anonymous~ : Bool,
  can_manage_chat~ : Bool,
  can_delete_messages~ : Bool,
  can_manage_video_chats~ : Bool,
  can_restrict_members~ : Bool,
  can_promote_members~ : Bool,
  can_change_info~ : Bool,
  can_invite_users~ : Bool,
  can_post_stories~ : Bool,
  can_edit_stories~ : Bool,
  can_delete_stories~ : Bool,
  can_post_messages? : Bool,
  can_edit_messages? : Bool,
  can_pin_messages? : Bool,
  can_manage_topics? : Bool,
) -> ChatAdministratorRights {
  {
    is_anonymous,
    can_manage_chat,
    can_delete_messages,
    can_manage_video_chats,
    can_restrict_members,
    can_promote_members,
    can_change_info,
    can_invite_users,
    can_post_stories,
    can_edit_stories,
    can_delete_stories,
    can_post_messages,
    can_edit_messages,
    can_pin_messages,
    can_manage_topics,
  }
}

///|
pub impl ToJson for ChatAdministratorRights with to_json(self) {
  let object : Map[String, Json] = {
    "is_anonymous": self.is_anonymous.to_json(),
    "can_manage_chat": self.can_manage_chat.to_json(),
    "can_delete_messages": self.can_delete_messages.to_json(),
    "can_manage_video_chats": self.can_manage_video_chats.to_json(),
    "can_restrict_members": self.can_restrict_members.to_json(),
    "can_promote_members": self.can_promote_members.to_json(),
    "can_change_info": self.can_change_info.to_json(),
    "can_invite_users": self.can_invite_users.to_json(),
    "can_post_stories": self.can_post_stories.to_json(),
    "can_edit_stories": self.can_edit_stories.to_json(),
    "can_delete_stories": self.can_delete_stories.to_json(),
  }
  if self.can_post_messages is Some(v) {
    object["can_post_messages"] = v.to_json()
  }
  if self.can_edit_messages is Some(v) {
    object["can_edit_messages"] = v.to_json()
  }
  if self.can_pin_messages is Some(v) {
    object["can_pin_messages"] = v.to_json()
  }
  if self.can_manage_topics is Some(v) {
    object["can_manage_topics"] = v.to_json()
  }
  object.to_json()
}

///|
pub impl @json.FromJson for ChatAdministratorRights with from_json(json, path) {
  guard json is Object(object) else {
    raise @json.JsonDecodeError(
      (path, "Expected object for ChatAdministratorRights"),
    )
  }
  let is_anonymous : Bool = @json.from_json(object["is_anonymous"], path~)
  let can_manage_chat : Bool = @json.from_json(object["can_manage_chat"], path~)
  let can_delete_messages : Bool = @json.from_json(
    object["can_delete_messages"],
    path~,
  )
  let can_manage_video_chats : Bool = @json.from_json(
    object["can_manage_video_chats"],
    path~,
  )
  let can_restrict_members : Bool = @json.from_json(
    object["can_restrict_members"],
    path~,
  )
  let can_promote_members : Bool = @json.from_json(
    object["can_promote_members"],
    path~,
  )
  let can_change_info : Bool = @json.from_json(object["can_change_info"], path~)
  let can_invite_users : Bool = @json.from_json(
    object["can_invite_users"],
    path~,
  )
  let can_post_stories : Bool = @json.from_json(
    object["can_post_stories"],
    path~,
  )
  let can_edit_stories : Bool = @json.from_json(
    object["can_edit_stories"],
    path~,
  )
  let can_delete_stories : Bool = @json.from_json(
    object["can_delete_stories"],
    path~,
  )
  let can_post_messages : Bool? = if object.get("can_post_messages") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_edit_messages : Bool? = if object.get("can_edit_messages") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_pin_messages : Bool? = if object.get("can_pin_messages") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  let can_manage_topics : Bool? = if object.get("can_manage_topics") is Some(v) {
    Some(@json.from_json(v, path~))
  } else {
    None
  }
  {
    is_anonymous,
    can_manage_chat,
    can_delete_messages,
    can_manage_video_chats,
    can_restrict_members,
    can_promote_members,
    can_change_info,
    can_invite_users,
    can_post_stories,
    can_edit_stories,
    can_delete_stories,
    can_post_messages,
    can_edit_messages,
    can_pin_messages,
    can_manage_topics,
  }
}