1use std::time::Duration;
2
3pub const MAX_TEXT_LENGTH: usize = 500;
7
8pub const MAX_TEXT_ATTACHMENT_LENGTH: usize = 10_000;
10
11pub const MAX_TEXT_ENTITIES: usize = 10;
13
14pub const MAX_LINKS: usize = 5;
16
17pub const MAX_POSTS_PER_REQUEST: usize = 100;
21
22pub const DEFAULT_POSTS_LIMIT: usize = 25;
24
25pub const MIN_CAROUSEL_ITEMS: usize = 2;
29
30pub const MAX_CAROUSEL_ITEMS: usize = 20;
32
33pub const REPLY_PUBLISH_DELAY: Duration = Duration::from_secs(10);
37
38pub const MIN_POLL_OPTIONS: usize = 2;
42
43pub const MAX_POLL_OPTIONS: usize = 4;
45
46pub const MAX_POLL_OPTION_LENGTH: usize = 25;
48
49pub const MAX_TOPIC_TAG_LENGTH: usize = 50;
53
54pub const MAX_ALT_TEXT_LENGTH: usize = 1000;
58
59pub const MIN_SEARCH_TIMESTAMP: i64 = 1_688_540_400;
63
64pub const VERSION: &str = env!("CARGO_PKG_VERSION");
68
69pub const DEFAULT_HTTP_TIMEOUT: Duration = Duration::from_secs(30);
73
74pub const BASE_API_URL: &str = "https://graph.threads.net";
78
79pub const POST_EXTENDED_FIELDS: &str = "id,media_product_type,media_type,media_url,permalink,owner,username,text,timestamp,shortcode,thumbnail_url,children,is_quote_post,alt_text,link_attachment_url,has_replies,reply_audience,quoted_post,reposted_post,gif_url,is_verified,profile_picture_url,poll_attachment,topic_tag,is_spoiler_media,text_entities,text_attachment,location_id,location,allowlisted_country_codes,ghost_post_status,ghost_post_expiration_timestamp,is_reply,root_post,replied_to,is_reply_owned_by_me,hide_status,reply_approval_status";
83
84pub const GHOST_POST_FIELDS: &str = "id,media_product_type,media_type,media_url,permalink,owner,username,text,timestamp,shortcode,thumbnail_url,ghost_post_status,ghost_post_expiration_timestamp";
86
87pub const USER_PROFILE_FIELDS: &str = "id,username,name,threads_profile_picture_url,threads_biography,is_verified,is_eligible_for_geo_gating,recently_searched_keywords";
89
90pub const REPLY_FIELDS: &str = "id,media_product_type,media_type,media_url,permalink,username,text,timestamp,shortcode,thumbnail_url,children,is_quote_post,has_replies,root_post,replied_to,is_reply,is_reply_owned_by_me,reply_audience,quoted_post,reposted_post,gif_url,hide_status,topic_tag,is_verified,profile_picture_url";
92
93pub const PENDING_REPLY_FIELDS: &str = "id,media_product_type,media_type,media_url,permalink,username,text,timestamp,shortcode,thumbnail_url,children,is_quote_post,has_replies,root_post,replied_to,is_reply,is_reply_owned_by_me,reply_audience,quoted_post,reposted_post,gif_url,alt_text,hide_status,topic_tag,is_verified,profile_picture_url,reply_approval_status";
96
97pub const PUBLIC_USER_FIELDS: &str = "username,name,profile_picture_url,biography,is_verified,follower_count,likes_count,quotes_count,replies_count,reposts_count,views_count";
99
100pub const CONTAINER_STATUS_FIELDS: &str = "id,status,error_message";
102
103pub const LOCATION_FIELDS: &str = "id,address,name,city,country,latitude,longitude,postal_code";
105
106pub const PUBLISHING_LIMIT_FIELDS: &str = "quota_usage,config,reply_quota_usage,reply_config,delete_quota_usage,delete_config,location_search_quota_usage,location_search_config";
108
109pub const CONTAINER_STATUS_IN_PROGRESS: &str = "IN_PROGRESS";
113pub const CONTAINER_STATUS_FINISHED: &str = "FINISHED";
115pub const CONTAINER_STATUS_PUBLISHED: &str = "PUBLISHED";
117pub const CONTAINER_STATUS_ERROR: &str = "ERROR";
119pub const CONTAINER_STATUS_EXPIRED: &str = "EXPIRED";
121
122pub const DEFAULT_CONTAINER_POLL_MAX_ATTEMPTS: u32 = 5;
125
126pub const DEFAULT_CONTAINER_POLL_INTERVAL: Duration = Duration::from_secs(60);
129
130pub const MEDIA_TYPE_TEXT: &str = "TEXT";
134pub const MEDIA_TYPE_IMAGE: &str = "IMAGE";
136pub const MEDIA_TYPE_VIDEO: &str = "VIDEO";
138pub const MEDIA_TYPE_CAROUSEL: &str = "CAROUSEL";
140pub const MEDIA_TYPE_AUDIO: &str = "AUDIO";
142pub const MEDIA_TYPE_REPOST_FACADE: &str = "REPOST_FACADE";
144pub const MEDIA_TYPE_RESPONSE_TEXT: &str = "TEXT_POST";
146pub const MEDIA_TYPE_RESPONSE_CAROUSEL: &str = "CAROUSEL_ALBUM";
148
149pub const ERR_EMPTY_POST_ID: &str = "Post ID is required";
153pub const ERR_EMPTY_USER_ID: &str = "User ID is required";
155pub const ERR_EMPTY_CONTAINER_ID: &str = "Container ID is required";
157pub const ERR_EMPTY_SEARCH_QUERY: &str = "Search query is required";
159
160pub const ERR_CODE_LINK_LIMIT_EXCEEDED: &str = "THREADS_API__LINK_LIMIT_EXCEEDED";
164pub const ERR_CODE_FEATURE_NOT_AVAILABLE: &str = "THREADS_API__FEATURE_NOT_AVAILABLE";
166pub const ERR_CODE_GEO_GATING_INVALID_COUNTRY_CODES: &str =
168 "THREADS_API__GEO_GATING_INVALID_COUNTRY_CODES";
169
170pub const CONTAINER_ERR_FAILED_DOWNLOADING_VIDEO: &str = "FAILED_DOWNLOADING_VIDEO";
174pub const CONTAINER_ERR_FAILED_PROCESSING_AUDIO: &str = "FAILED_PROCESSING_AUDIO";
176pub const CONTAINER_ERR_FAILED_PROCESSING_VIDEO: &str = "FAILED_PROCESSING_VIDEO";
178pub const CONTAINER_ERR_INVALID_ASPECT_RATIO: &str = "INVALID_ASPEC_RATIO";
180pub const CONTAINER_ERR_INVALID_BIT_RATE: &str = "INVALID_BIT_RATE";
182pub const CONTAINER_ERR_INVALID_DURATION: &str = "INVALID_DURATION";
184pub const CONTAINER_ERR_INVALID_FRAME_RATE: &str = "INVALID_FRAME_RATE";
186pub const CONTAINER_ERR_INVALID_AUDIO_CHANNELS: &str = "INVALID_AUDIO_CHANNELS";
188pub const CONTAINER_ERR_INVALID_AUDIO_CHANNEL_LAYOUT: &str = "INVALID_AUDIO_CHANNEL_LAYOUT";
190pub const CONTAINER_ERR_UNKNOWN: &str = "UNKNOWN";