oxidebot 0.1.8

A lightweight yet powerful chatbot framework
Documentation
//! Granular platform capability and constraint reporting.

use std::{
    collections::{BTreeMap, BTreeSet},
    error::Error,
    fmt,
};

use crate::{content::MessageVisibility, interaction::ButtonStyle};

#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
pub enum SupportLevel {
    Native,
    Emulated,
    #[default]
    Unsupported,
}

impl SupportLevel {
    pub const fn is_supported(self) -> bool {
        !matches!(self, Self::Unsupported)
    }
}

#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct ContentCapabilities {
    pub plain_text: SupportLevel,
    pub rich_text: SupportLevel,
    pub rich_layout: SupportLevel,
    pub images: SupportLevel,
    pub video: SupportLevel,
    pub audio: SupportLevel,
    pub animation: SupportLevel,
    pub voice_notes: SupportLevel,
    pub video_notes: SupportLevel,
    pub files: SupportLevel,
    pub media_galleries: SupportLevel,
    pub location: SupportLevel,
    pub contacts: SupportLevel,
    pub stickers: SupportLevel,
    pub custom_emoji: SupportLevel,
    pub polls: SupportLevel,
    pub quizzes: SupportLevel,
    pub checklists: SupportLevel,
    pub platform_native: SupportLevel,
}

#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct DeliveryCapabilities {
    pub replies: SupportLevel,
    pub quoted_replies: SupportLevel,
    pub threads: SupportLevel,
    pub silent: SupportLevel,
    pub forced_notification: SupportLevel,
    pub protected_content: SupportLevel,
    pub link_preview_control: SupportLevel,
    pub mention_control: SupportLevel,
    pub ephemeral: SupportLevel,
    pub private_to_users: SupportLevel,
    pub scheduling: SupportLevel,
    pub drafts: SupportLevel,
    pub idempotency_keys: SupportLevel,
    pub client_message_ids: SupportLevel,
    pub metadata: SupportLevel,
    pub supported_visibilities: Vec<MessageVisibility>,
}

#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct ButtonCapabilities {
    pub callback: SupportLevel,
    pub send_text: SupportLevel,
    pub url: SupportLevel,
    pub web_app: SupportLevel,
    pub login: SupportLevel,
    pub switch_inline_query: SupportLevel,
    pub copy_text: SupportLevel,
    pub game: SupportLevel,
    pub pay: SupportLevel,
    pub disabled: SupportLevel,
    pub icons: SupportLevel,
    pub styles: BTreeSet<ButtonStyle>,
    pub max_callback_bytes: Option<usize>,
    pub max_buttons_per_row: Option<usize>,
    pub max_rows: Option<usize>,
}

#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct ComponentCapabilities {
    pub inline_keyboard: SupportLevel,
    pub reply_keyboard: SupportLevel,
    pub selects: SupportLevel,
    pub text_input: SupportLevel,
    pub number_input: SupportLevel,
    pub checkbox: SupportLevel,
    pub checkbox_group: SupportLevel,
    pub radio_group: SupportLevel,
    pub toggle: SupportLevel,
    pub date_picker: SupportLevel,
    pub time_picker: SupportLevel,
    pub datetime_picker: SupportLevel,
    pub file_upload: SupportLevel,
    pub dynamic_suggestions: SupportLevel,
    pub modals: SupportLevel,
    pub platform_native: SupportLevel,
    pub buttons: ButtonCapabilities,
}

#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct InteractionLifecycleCapabilities {
    pub acknowledge: SupportLevel,
    pub defer: SupportLevel,
    pub notifications: SupportLevel,
    pub open_url: SupportLevel,
    pub initial_message: SupportLevel,
    pub update_original: SupportLevel,
    pub followups: SupportLevel,
    pub edit_original: SupportLevel,
    pub delete_original: SupportLevel,
    pub validation_errors: SupportLevel,
    pub view_navigation: SupportLevel,
}

#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct ConversationCapabilities {
    pub direct: SupportLevel,
    pub groups: SupportLevel,
    pub channels: SupportLevel,
    pub threads: SupportLevel,
    pub topics: SupportLevel,
    pub forums: SupportLevel,
    pub create_threads: SupportLevel,
    pub manage_threads: SupportLevel,
    pub history: SupportLevel,
    pub search: SupportLevel,
    pub members: SupportLevel,
    pub roles: SupportLevel,
    pub member_tags: SupportLevel,
    pub permissions: SupportLevel,
    pub moderation: SupportLevel,
    pub join_requests: SupportLevel,
    pub invite_links: SupportLevel,
    pub profile: SupportLevel,
    pub leave: SupportLevel,
}

#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct CollaborationCapabilities {
    pub reactions: SupportLevel,
    pub multiple_reactions: SupportLevel,
    pub reaction_users: SupportLevel,
    pub pins: SupportLevel,
    pub typing: SupportLevel,
    pub read_receipts: SupportLevel,
    pub call_events: SupportLevel,
    pub call_management: SupportLevel,
    pub forwarding: SupportLevel,
    pub copying: SupportLevel,
    pub batch_send: SupportLevel,
    pub bulk_delete: SupportLevel,
    pub broadcast: SupportLevel,
}

#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct ApplicationCapabilities {
    pub commands: SupportLevel,
    pub structured_commands: SupportLevel,
    pub command_localizations: SupportLevel,
    pub autocomplete: SupportLevel,
    pub chat_menu: SupportLevel,
    pub home_surface: SupportLevel,
    pub rich_menu: SupportLevel,
    pub mini_apps: SupportLevel,
    pub payments: SupportLevel,
    pub subscriptions: SupportLevel,
}

#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct PlatformLimits {
    pub max_text_length: Option<usize>,
    pub max_caption_length: Option<usize>,
    pub max_rich_text_length: Option<usize>,
    pub max_media_per_message: Option<usize>,
    pub max_file_bytes: Option<u64>,
    pub max_components: Option<usize>,
    pub max_commands: Option<usize>,
    pub max_poll_options: Option<usize>,
    pub max_batch_size: Option<usize>,
    pub edit_window_seconds: Option<u64>,
    pub supported_mime_types: Vec<String>,
    pub platform_limits: BTreeMap<String, serde_json::Value>,
}

#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct BotCapabilities {
    pub content: ContentCapabilities,
    pub delivery: DeliveryCapabilities,
    pub components: ComponentCapabilities,
    pub interaction_lifecycle: InteractionLifecycleCapabilities,
    pub conversations: ConversationCapabilities,
    pub collaboration: CollaborationCapabilities,
    pub application: ApplicationCapabilities,
    pub limits: PlatformLimits,
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct UnsupportedFeatureError {
    pub feature: String,
}

impl UnsupportedFeatureError {
    pub fn new(feature: impl Into<String>) -> Self {
        Self {
            feature: feature.into(),
        }
    }
}

impl fmt::Display for UnsupportedFeatureError {
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(
            formatter,
            "feature {:?} is not supported by this adapter",
            self.feature
        )
    }
}

impl Error for UnsupportedFeatureError {}