use polyoxide_core::{HttpClient, QueryBuilder, Request};
use crate::{
error::GammaError,
types::{CountResponse, Event, EventCreator, EventsPagination, KeysetEventsResponse, Tag},
};
#[derive(Clone)]
pub struct Events {
pub(crate) http_client: HttpClient,
}
impl Events {
pub fn list(&self) -> ListEvents {
ListEvents {
request: Request::new(self.http_client.clone(), "/events"),
}
}
pub fn get(&self, id: impl Into<String>) -> GetEvent {
GetEvent {
request: Request::new(
self.http_client.clone(),
format!("/events/{}", urlencoding::encode(&id.into())),
),
}
}
pub fn get_by_slug(&self, slug: impl Into<String>) -> GetEvent {
GetEvent {
request: Request::new(
self.http_client.clone(),
format!("/events/slug/{}", urlencoding::encode(&slug.into())),
),
}
}
pub fn tags(&self, id: impl Into<String>) -> Request<Vec<Tag>, GammaError> {
Request::new(
self.http_client.clone(),
format!("/events/{}/tags", urlencoding::encode(&id.into())),
)
}
pub fn tweet_count(&self, id: impl Into<String>) -> Request<CountResponse, GammaError> {
Request::new(
self.http_client.clone(),
format!("/events/{}/tweet-count", urlencoding::encode(&id.into())),
)
}
pub fn comment_count(&self, id: impl Into<String>) -> Request<CountResponse, GammaError> {
Request::new(
self.http_client.clone(),
format!("/events/{}/comments/count", urlencoding::encode(&id.into())),
)
}
pub fn list_creators(&self) -> ListEventCreators {
ListEventCreators {
request: Request::new(self.http_client.clone(), "/events/creators"),
}
}
pub fn get_creator(&self, id: impl Into<String>) -> Request<EventCreator, GammaError> {
Request::new(
self.http_client.clone(),
format!("/events/creators/{}", urlencoding::encode(&id.into())),
)
}
pub fn list_paginated(&self) -> ListPaginatedEvents {
ListPaginatedEvents {
request: Request::new(self.http_client.clone(), "/events/pagination"),
}
}
pub fn list_results(&self) -> ListEventResults {
ListEventResults {
request: Request::new(self.http_client.clone(), "/events/results"),
}
}
pub fn list_keyset(&self) -> ListKeysetEvents {
ListKeysetEvents {
request: Request::new(self.http_client.clone(), "/events/keyset"),
}
}
}
pub struct ListEventCreators {
request: Request<Vec<EventCreator>, GammaError>,
}
impl ListEventCreators {
pub fn limit(mut self, limit: u32) -> Self {
self.request = self.request.query("limit", limit);
self
}
pub fn offset(mut self, offset: u32) -> Self {
self.request = self.request.query("offset", offset);
self
}
pub fn order(mut self, order: impl Into<String>) -> Self {
self.request = self.request.query("order", order.into());
self
}
pub fn ascending(mut self, ascending: bool) -> Self {
self.request = self.request.query("ascending", ascending);
self
}
pub fn creator_name(mut self, name: impl Into<String>) -> Self {
self.request = self.request.query("creator_name", name.into());
self
}
pub fn creator_handle(mut self, handle: impl Into<String>) -> Self {
self.request = self.request.query("creator_handle", handle.into());
self
}
pub async fn send(self) -> Result<Vec<EventCreator>, GammaError> {
self.request.send().await
}
}
pub struct ListPaginatedEvents {
request: Request<EventsPagination, GammaError>,
}
impl ListPaginatedEvents {
pub fn limit(mut self, limit: u32) -> Self {
self.request = self.request.query("limit", limit);
self
}
pub fn offset(mut self, offset: u32) -> Self {
self.request = self.request.query("offset", offset);
self
}
pub fn order(mut self, order: impl Into<String>) -> Self {
self.request = self.request.query("order", order.into());
self
}
pub fn ascending(mut self, ascending: bool) -> Self {
self.request = self.request.query("ascending", ascending);
self
}
pub fn include_chat(mut self, include: bool) -> Self {
self.request = self.request.query("include_chat", include);
self
}
pub fn include_template(mut self, include: bool) -> Self {
self.request = self.request.query("include_template", include);
self
}
pub fn recurrence(mut self, recurrence: impl Into<String>) -> Self {
self.request = self.request.query("recurrence", recurrence.into());
self
}
pub async fn send(self) -> Result<EventsPagination, GammaError> {
self.request.send().await
}
}
pub struct ListEventResults {
request: Request<Vec<Event>, GammaError>,
}
impl ListEventResults {
pub fn limit(mut self, limit: u32) -> Self {
self.request = self.request.query("limit", limit);
self
}
pub fn offset(mut self, offset: u32) -> Self {
self.request = self.request.query("offset", offset);
self
}
pub fn order(mut self, order: impl Into<String>) -> Self {
self.request = self.request.query("order", order.into());
self
}
pub fn ascending(mut self, ascending: bool) -> Self {
self.request = self.request.query("ascending", ascending);
self
}
pub async fn send(self) -> Result<Vec<Event>, GammaError> {
self.request.send().await
}
}
pub struct ListKeysetEvents {
request: Request<KeysetEventsResponse, GammaError>,
}
impl ListKeysetEvents {
pub fn limit(mut self, limit: u32) -> Self {
self.request = self.request.query("limit", limit);
self
}
pub fn order(mut self, order: impl Into<String>) -> Self {
self.request = self.request.query("order", order.into());
self
}
pub fn ascending(mut self, ascending: bool) -> Self {
self.request = self.request.query("ascending", ascending);
self
}
pub fn after_cursor(mut self, cursor: impl Into<String>) -> Self {
self.request = self.request.query("after_cursor", cursor.into());
self
}
pub fn id(mut self, ids: impl IntoIterator<Item = i64>) -> Self {
self.request = self.request.query_many("id", ids);
self
}
pub fn slug(mut self, slugs: impl IntoIterator<Item = impl ToString>) -> Self {
self.request = self.request.query_many("slug", slugs);
self
}
pub fn closed(mut self, closed: bool) -> Self {
self.request = self.request.query("closed", closed);
self
}
pub fn live(mut self, live: bool) -> Self {
self.request = self.request.query("live", live);
self
}
pub fn featured(mut self, featured: bool) -> Self {
self.request = self.request.query("featured", featured);
self
}
pub fn title_search(mut self, query: impl Into<String>) -> Self {
self.request = self.request.query("title_search", query.into());
self
}
pub fn tag_id(mut self, tag_ids: impl IntoIterator<Item = i64>) -> Self {
self.request = self.request.query_many("tag_id", tag_ids);
self
}
pub fn tag_slug(mut self, slug: impl Into<String>) -> Self {
self.request = self.request.query("tag_slug", slug.into());
self
}
pub fn liquidity_min(mut self, min: f64) -> Self {
self.request = self.request.query("liquidity_min", min);
self
}
pub fn liquidity_max(mut self, max: f64) -> Self {
self.request = self.request.query("liquidity_max", max);
self
}
pub fn volume_min(mut self, min: f64) -> Self {
self.request = self.request.query("volume_min", min);
self
}
pub fn volume_max(mut self, max: f64) -> Self {
self.request = self.request.query("volume_max", max);
self
}
pub async fn send(self) -> Result<KeysetEventsResponse, GammaError> {
self.request.send().await
}
}
pub struct GetEvent {
request: Request<Event, GammaError>,
}
impl GetEvent {
pub fn include_chat(mut self, include: bool) -> Self {
self.request = self.request.query("include_chat", include);
self
}
pub fn include_template(mut self, include: bool) -> Self {
self.request = self.request.query("include_template", include);
self
}
pub async fn send(self) -> Result<Event, GammaError> {
self.request.send().await
}
}
pub struct ListEvents {
request: Request<Vec<Event>, GammaError>,
}
impl ListEvents {
pub fn limit(mut self, limit: u32) -> Self {
self.request = self.request.query("limit", limit);
self
}
pub fn offset(mut self, offset: u32) -> Self {
self.request = self.request.query("offset", offset);
self
}
pub fn order(mut self, order: impl Into<String>) -> Self {
self.request = self.request.query("order", order.into());
self
}
pub fn ascending(mut self, ascending: bool) -> Self {
self.request = self.request.query("ascending", ascending);
self
}
pub fn id(mut self, ids: impl IntoIterator<Item = i64>) -> Self {
self.request = self.request.query_many("id", ids);
self
}
pub fn tag_id(mut self, tag_id: i64) -> Self {
self.request = self.request.query("tag_id", tag_id);
self
}
pub fn exclude_tag_id(mut self, tag_ids: impl IntoIterator<Item = i64>) -> Self {
self.request = self.request.query_many("exclude_tag_id", tag_ids);
self
}
pub fn slug(mut self, slugs: impl IntoIterator<Item = impl ToString>) -> Self {
self.request = self.request.query_many("slug", slugs);
self
}
pub fn tag_slug(mut self, slug: impl Into<String>) -> Self {
self.request = self.request.query("tag_slug", slug.into());
self
}
pub fn related_tags(mut self, include: bool) -> Self {
self.request = self.request.query("related_tags", include);
self
}
pub fn active(mut self, active: bool) -> Self {
self.request = self.request.query("active", active);
self
}
pub fn archived(mut self, archived: bool) -> Self {
self.request = self.request.query("archived", archived);
self
}
pub fn featured(mut self, featured: bool) -> Self {
self.request = self.request.query("featured", featured);
self
}
pub fn cyom(mut self, cyom: bool) -> Self {
self.request = self.request.query("cyom", cyom);
self
}
pub fn include_chat(mut self, include: bool) -> Self {
self.request = self.request.query("include_chat", include);
self
}
pub fn include_template(mut self, include: bool) -> Self {
self.request = self.request.query("include_template", include);
self
}
pub fn recurrence(mut self, recurrence: impl Into<String>) -> Self {
self.request = self.request.query("recurrence", recurrence.into());
self
}
pub fn closed(mut self, closed: bool) -> Self {
self.request = self.request.query("closed", closed);
self
}
pub fn liquidity_min(mut self, min: f64) -> Self {
self.request = self.request.query("liquidity_min", min);
self
}
pub fn liquidity_max(mut self, max: f64) -> Self {
self.request = self.request.query("liquidity_max", max);
self
}
pub fn volume_min(mut self, min: f64) -> Self {
self.request = self.request.query("volume_min", min);
self
}
pub fn volume_max(mut self, max: f64) -> Self {
self.request = self.request.query("volume_max", max);
self
}
pub fn start_date_min(mut self, date: impl Into<String>) -> Self {
self.request = self.request.query("start_date_min", date.into());
self
}
pub fn start_date_max(mut self, date: impl Into<String>) -> Self {
self.request = self.request.query("start_date_max", date.into());
self
}
pub fn end_date_min(mut self, date: impl Into<String>) -> Self {
self.request = self.request.query("end_date_min", date.into());
self
}
pub fn end_date_max(mut self, date: impl Into<String>) -> Self {
self.request = self.request.query("end_date_max", date.into());
self
}
pub async fn send(self) -> Result<Vec<Event>, GammaError> {
self.request.send().await
}
}
#[cfg(test)]
mod tests {
use crate::Gamma;
fn gamma() -> Gamma {
Gamma::new().unwrap()
}
#[test]
fn test_list_events_full_chain() {
let _list = gamma()
.events()
.list()
.limit(10)
.offset(20)
.order("volume")
.ascending(true)
.id(vec![1i64, 2])
.tag_id(42)
.exclude_tag_id(vec![99i64])
.slug(vec!["slug-a"])
.tag_slug("politics")
.related_tags(true)
.active(true)
.archived(false)
.featured(true)
.cyom(false)
.include_chat(true)
.include_template(false)
.recurrence("daily")
.closed(false)
.liquidity_min(1000.0)
.liquidity_max(50000.0)
.volume_min(100.0)
.volume_max(10000.0)
.start_date_min("2024-01-01")
.start_date_max("2025-01-01")
.end_date_min("2024-06-01")
.end_date_max("2025-12-31");
}
#[test]
fn test_get_event_accepts_str_and_string() {
let _req1 = gamma().events().get("evt-123");
let _req2 = gamma().events().get(String::from("evt-123"));
}
#[test]
fn test_get_by_slug_accepts_str_and_string() {
let _req1 = gamma().events().get_by_slug("slug");
let _req2 = gamma().events().get_by_slug(String::from("slug"));
}
#[test]
fn test_get_event_with_query_params() {
let _req = gamma()
.events()
.get("evt-123")
.include_chat(true)
.include_template(false);
}
#[test]
fn test_event_tags_accepts_str_and_string() {
let _req1 = gamma().events().tags("evt-123");
let _req2 = gamma().events().tags(String::from("evt-123"));
}
#[test]
fn test_event_tweet_count() {
let _req = gamma().events().tweet_count("evt-123");
}
#[test]
fn test_event_comment_count() {
let _req = gamma().events().comment_count("evt-123");
}
#[test]
fn test_list_creators_full_chain() {
let _req = gamma()
.events()
.list_creators()
.limit(10)
.offset(0)
.order("createdAt")
.ascending(true)
.creator_name("poly")
.creator_handle("polymarket");
}
#[test]
fn test_get_creator_accepts_str_and_string() {
let _req1 = gamma().events().get_creator("c-1");
let _req2 = gamma().events().get_creator(String::from("c-1"));
}
#[test]
fn test_list_paginated_full_chain() {
let _req = gamma()
.events()
.list_paginated()
.limit(25)
.offset(50)
.order("startDate")
.ascending(false)
.include_chat(false)
.include_template(true)
.recurrence("daily");
}
#[test]
fn test_list_results_full_chain() {
let _req = gamma()
.events()
.list_results()
.limit(5)
.offset(0)
.order("endDate")
.ascending(true);
}
#[test]
fn test_list_keyset_full_chain() {
let _req = gamma()
.events()
.list_keyset()
.limit(50)
.order("volume_num")
.ascending(true)
.after_cursor("abc")
.id(vec![1i64, 2])
.slug(vec!["slug-a"])
.closed(false)
.live(true)
.featured(true)
.title_search("bitcoin")
.tag_id(vec![42i64])
.tag_slug("politics")
.liquidity_min(0.0)
.liquidity_max(1e6)
.volume_min(0.0)
.volume_max(1e6);
}
}