1use polyoxide_core::{HttpClient, QueryBuilder, Request};
2
3use crate::{
4 error::GammaError,
5 types::{CountResponse, Event, EventCreator, EventsPagination, KeysetEventsResponse, Tag},
6};
7
8#[derive(Clone)]
10pub struct Events {
11 pub(crate) http_client: HttpClient,
12}
13
14impl Events {
15 pub fn list(&self) -> ListEvents {
17 ListEvents {
18 request: Request::new(self.http_client.clone(), "/events"),
19 }
20 }
21
22 pub fn get(&self, id: impl Into<String>) -> GetEvent {
24 GetEvent {
25 request: Request::new(
26 self.http_client.clone(),
27 format!("/events/{}", urlencoding::encode(&id.into())),
28 ),
29 }
30 }
31
32 pub fn get_by_slug(&self, slug: impl Into<String>) -> GetEvent {
34 GetEvent {
35 request: Request::new(
36 self.http_client.clone(),
37 format!("/events/slug/{}", urlencoding::encode(&slug.into())),
38 ),
39 }
40 }
41
42 pub fn tags(&self, id: impl Into<String>) -> Request<Vec<Tag>, GammaError> {
44 Request::new(
45 self.http_client.clone(),
46 format!("/events/{}/tags", urlencoding::encode(&id.into())),
47 )
48 }
49
50 pub fn tweet_count(&self, id: impl Into<String>) -> Request<CountResponse, GammaError> {
52 Request::new(
53 self.http_client.clone(),
54 format!("/events/{}/tweet-count", urlencoding::encode(&id.into())),
55 )
56 }
57
58 pub fn comment_count(&self, id: impl Into<String>) -> Request<CountResponse, GammaError> {
60 Request::new(
61 self.http_client.clone(),
62 format!("/events/{}/comments/count", urlencoding::encode(&id.into())),
63 )
64 }
65
66 pub fn list_creators(&self) -> ListEventCreators {
69 ListEventCreators {
70 request: Request::new(self.http_client.clone(), "/events/creators"),
71 }
72 }
73
74 pub fn get_creator(&self, id: impl Into<String>) -> Request<EventCreator, GammaError> {
76 Request::new(
77 self.http_client.clone(),
78 format!("/events/creators/{}", urlencoding::encode(&id.into())),
79 )
80 }
81
82 pub fn list_paginated(&self) -> ListPaginatedEvents {
85 ListPaginatedEvents {
86 request: Request::new(self.http_client.clone(), "/events/pagination"),
87 }
88 }
89
90 pub fn list_results(&self) -> ListEventResults {
92 ListEventResults {
93 request: Request::new(self.http_client.clone(), "/events/results"),
94 }
95 }
96
97 pub fn list_keyset(&self) -> ListKeysetEvents {
112 ListKeysetEvents {
113 request: Request::new(self.http_client.clone(), "/events/keyset"),
114 }
115 }
116}
117
118pub struct ListEventCreators {
120 request: Request<Vec<EventCreator>, GammaError>,
121}
122
123impl ListEventCreators {
124 pub fn limit(mut self, limit: u32) -> Self {
126 self.request = self.request.query("limit", limit);
127 self
128 }
129
130 pub fn offset(mut self, offset: u32) -> Self {
132 self.request = self.request.query("offset", offset);
133 self
134 }
135
136 pub fn order(mut self, order: impl Into<String>) -> Self {
138 self.request = self.request.query("order", order.into());
139 self
140 }
141
142 pub fn ascending(mut self, ascending: bool) -> Self {
144 self.request = self.request.query("ascending", ascending);
145 self
146 }
147
148 pub fn creator_name(mut self, name: impl Into<String>) -> Self {
150 self.request = self.request.query("creator_name", name.into());
151 self
152 }
153
154 pub fn creator_handle(mut self, handle: impl Into<String>) -> Self {
156 self.request = self.request.query("creator_handle", handle.into());
157 self
158 }
159
160 pub async fn send(self) -> Result<Vec<EventCreator>, GammaError> {
162 self.request.send().await
163 }
164}
165
166pub struct ListPaginatedEvents {
168 request: Request<EventsPagination, GammaError>,
169}
170
171impl ListPaginatedEvents {
172 pub fn limit(mut self, limit: u32) -> Self {
174 self.request = self.request.query("limit", limit);
175 self
176 }
177
178 pub fn offset(mut self, offset: u32) -> Self {
180 self.request = self.request.query("offset", offset);
181 self
182 }
183
184 pub fn order(mut self, order: impl Into<String>) -> Self {
186 self.request = self.request.query("order", order.into());
187 self
188 }
189
190 pub fn ascending(mut self, ascending: bool) -> Self {
192 self.request = self.request.query("ascending", ascending);
193 self
194 }
195
196 pub fn include_chat(mut self, include: bool) -> Self {
198 self.request = self.request.query("include_chat", include);
199 self
200 }
201
202 pub fn include_template(mut self, include: bool) -> Self {
204 self.request = self.request.query("include_template", include);
205 self
206 }
207
208 pub fn recurrence(mut self, recurrence: impl Into<String>) -> Self {
210 self.request = self.request.query("recurrence", recurrence.into());
211 self
212 }
213
214 pub async fn send(self) -> Result<EventsPagination, GammaError> {
216 self.request.send().await
217 }
218}
219
220pub struct ListEventResults {
222 request: Request<Vec<Event>, GammaError>,
223}
224
225impl ListEventResults {
226 pub fn limit(mut self, limit: u32) -> Self {
228 self.request = self.request.query("limit", limit);
229 self
230 }
231
232 pub fn offset(mut self, offset: u32) -> Self {
234 self.request = self.request.query("offset", offset);
235 self
236 }
237
238 pub fn order(mut self, order: impl Into<String>) -> Self {
240 self.request = self.request.query("order", order.into());
241 self
242 }
243
244 pub fn ascending(mut self, ascending: bool) -> Self {
246 self.request = self.request.query("ascending", ascending);
247 self
248 }
249
250 pub async fn send(self) -> Result<Vec<Event>, GammaError> {
252 self.request.send().await
253 }
254}
255
256pub struct ListKeysetEvents {
258 request: Request<KeysetEventsResponse, GammaError>,
259}
260
261impl ListKeysetEvents {
262 pub fn limit(mut self, limit: u32) -> Self {
264 self.request = self.request.query("limit", limit);
265 self
266 }
267
268 pub fn order(mut self, order: impl Into<String>) -> Self {
270 self.request = self.request.query("order", order.into());
271 self
272 }
273
274 pub fn ascending(mut self, ascending: bool) -> Self {
276 self.request = self.request.query("ascending", ascending);
277 self
278 }
279
280 pub fn after_cursor(mut self, cursor: impl Into<String>) -> Self {
282 self.request = self.request.query("after_cursor", cursor.into());
283 self
284 }
285
286 pub fn id(mut self, ids: impl IntoIterator<Item = i64>) -> Self {
288 self.request = self.request.query_many("id", ids);
289 self
290 }
291
292 pub fn slug(mut self, slugs: impl IntoIterator<Item = impl ToString>) -> Self {
294 self.request = self.request.query_many("slug", slugs);
295 self
296 }
297
298 pub fn closed(mut self, closed: bool) -> Self {
300 self.request = self.request.query("closed", closed);
301 self
302 }
303
304 pub fn live(mut self, live: bool) -> Self {
306 self.request = self.request.query("live", live);
307 self
308 }
309
310 pub fn featured(mut self, featured: bool) -> Self {
312 self.request = self.request.query("featured", featured);
313 self
314 }
315
316 pub fn title_search(mut self, query: impl Into<String>) -> Self {
318 self.request = self.request.query("title_search", query.into());
319 self
320 }
321
322 pub fn tag_id(mut self, tag_ids: impl IntoIterator<Item = i64>) -> Self {
324 self.request = self.request.query_many("tag_id", tag_ids);
325 self
326 }
327
328 pub fn tag_slug(mut self, slug: impl Into<String>) -> Self {
330 self.request = self.request.query("tag_slug", slug.into());
331 self
332 }
333
334 pub fn liquidity_min(mut self, min: f64) -> Self {
336 self.request = self.request.query("liquidity_min", min);
337 self
338 }
339
340 pub fn liquidity_max(mut self, max: f64) -> Self {
342 self.request = self.request.query("liquidity_max", max);
343 self
344 }
345
346 pub fn volume_min(mut self, min: f64) -> Self {
348 self.request = self.request.query("volume_min", min);
349 self
350 }
351
352 pub fn volume_max(mut self, max: f64) -> Self {
354 self.request = self.request.query("volume_max", max);
355 self
356 }
357
358 pub fn cyom(mut self, cyom: bool) -> Self {
360 self.request = self.request.query("cyom", cyom);
361 self
362 }
363
364 pub fn start_date_min(mut self, date: impl Into<String>) -> Self {
366 self.request = self.request.query("start_date_min", date.into());
367 self
368 }
369
370 pub fn start_date_max(mut self, date: impl Into<String>) -> Self {
372 self.request = self.request.query("start_date_max", date.into());
373 self
374 }
375
376 pub fn end_date_min(mut self, date: impl Into<String>) -> Self {
378 self.request = self.request.query("end_date_min", date.into());
379 self
380 }
381
382 pub fn end_date_max(mut self, date: impl Into<String>) -> Self {
384 self.request = self.request.query("end_date_max", date.into());
385 self
386 }
387
388 pub fn start_time_min(mut self, time: impl Into<String>) -> Self {
390 self.request = self.request.query("start_time_min", time.into());
391 self
392 }
393
394 pub fn start_time_max(mut self, time: impl Into<String>) -> Self {
396 self.request = self.request.query("start_time_max", time.into());
397 self
398 }
399
400 pub fn exclude_tag_id(mut self, tag_ids: impl IntoIterator<Item = i64>) -> Self {
402 self.request = self.request.query_many("exclude_tag_id", tag_ids);
403 self
404 }
405
406 pub fn related_tags(mut self, include: bool) -> Self {
408 self.request = self.request.query("related_tags", include);
409 self
410 }
411
412 pub fn tag_match(mut self, mode: impl Into<String>) -> Self {
414 self.request = self.request.query("tag_match", mode.into());
415 self
416 }
417
418 pub fn series_id(mut self, series_ids: impl IntoIterator<Item = i64>) -> Self {
420 self.request = self.request.query_many("series_id", series_ids);
421 self
422 }
423
424 pub fn game_id(mut self, game_ids: impl IntoIterator<Item = i64>) -> Self {
426 self.request = self.request.query_many("game_id", game_ids);
427 self
428 }
429
430 pub fn event_date(mut self, date: impl Into<String>) -> Self {
432 self.request = self.request.query("event_date", date.into());
433 self
434 }
435
436 pub fn event_week(mut self, week: i64) -> Self {
438 self.request = self.request.query("event_week", week);
439 self
440 }
441
442 pub fn featured_order(mut self, featured_order: bool) -> Self {
444 self.request = self.request.query("featured_order", featured_order);
445 self
446 }
447
448 pub fn recurrence(mut self, recurrence: impl Into<String>) -> Self {
450 self.request = self.request.query("recurrence", recurrence.into());
451 self
452 }
453
454 pub fn created_by(mut self, creators: impl IntoIterator<Item = impl ToString>) -> Self {
456 self.request = self.request.query_many("created_by", creators);
457 self
458 }
459
460 pub fn parent_event_id(mut self, parent_event_id: i64) -> Self {
462 self.request = self.request.query("parent_event_id", parent_event_id);
463 self
464 }
465
466 pub fn include_children(mut self, include: bool) -> Self {
468 self.request = self.request.query("include_children", include);
469 self
470 }
471
472 pub fn partner_slug(mut self, slug: impl Into<String>) -> Self {
474 self.request = self.request.query("partner_slug", slug.into());
475 self
476 }
477
478 pub fn include_chat(mut self, include: bool) -> Self {
480 self.request = self.request.query("include_chat", include);
481 self
482 }
483
484 pub fn include_template(mut self, include: bool) -> Self {
486 self.request = self.request.query("include_template", include);
487 self
488 }
489
490 pub fn include_best_lines(mut self, include: bool) -> Self {
492 self.request = self.request.query("include_best_lines", include);
493 self
494 }
495
496 pub fn locale(mut self, locale: impl Into<String>) -> Self {
498 self.request = self.request.query("locale", locale.into());
499 self
500 }
501
502 pub async fn send(self) -> Result<KeysetEventsResponse, GammaError> {
508 self.request.send().await
509 }
510}
511
512pub struct GetEvent {
514 request: Request<Event, GammaError>,
515}
516
517impl GetEvent {
518 pub fn include_chat(mut self, include: bool) -> Self {
520 self.request = self.request.query("include_chat", include);
521 self
522 }
523
524 pub fn include_template(mut self, include: bool) -> Self {
526 self.request = self.request.query("include_template", include);
527 self
528 }
529
530 pub async fn send(self) -> Result<Event, GammaError> {
532 self.request.send().await
533 }
534}
535
536pub struct ListEvents {
538 request: Request<Vec<Event>, GammaError>,
539}
540
541impl ListEvents {
542 pub fn limit(mut self, limit: u32) -> Self {
544 self.request = self.request.query("limit", limit);
545 self
546 }
547
548 pub fn offset(mut self, offset: u32) -> Self {
550 self.request = self.request.query("offset", offset);
551 self
552 }
553
554 pub fn order(mut self, order: impl Into<String>) -> Self {
556 self.request = self.request.query("order", order.into());
557 self
558 }
559
560 pub fn ascending(mut self, ascending: bool) -> Self {
562 self.request = self.request.query("ascending", ascending);
563 self
564 }
565
566 pub fn id(mut self, ids: impl IntoIterator<Item = i64>) -> Self {
571 self.request = self.request.query_many("id", ids);
572 self
573 }
574
575 pub fn tag_id(mut self, tag_id: i64) -> Self {
577 self.request = self.request.query("tag_id", tag_id);
578 self
579 }
580
581 pub fn exclude_tag_id(mut self, tag_ids: impl IntoIterator<Item = i64>) -> Self {
586 self.request = self.request.query_many("exclude_tag_id", tag_ids);
587 self
588 }
589
590 pub fn slug(mut self, slugs: impl IntoIterator<Item = impl ToString>) -> Self {
595 self.request = self.request.query_many("slug", slugs);
596 self
597 }
598
599 pub fn tag_slug(mut self, slug: impl Into<String>) -> Self {
601 self.request = self.request.query("tag_slug", slug.into());
602 self
603 }
604
605 pub fn related_tags(mut self, include: bool) -> Self {
607 self.request = self.request.query("related_tags", include);
608 self
609 }
610
611 pub fn active(mut self, active: bool) -> Self {
613 self.request = self.request.query("active", active);
614 self
615 }
616
617 pub fn archived(mut self, archived: bool) -> Self {
619 self.request = self.request.query("archived", archived);
620 self
621 }
622
623 pub fn featured(mut self, featured: bool) -> Self {
625 self.request = self.request.query("featured", featured);
626 self
627 }
628
629 pub fn cyom(mut self, cyom: bool) -> Self {
631 self.request = self.request.query("cyom", cyom);
632 self
633 }
634
635 pub fn include_chat(mut self, include: bool) -> Self {
637 self.request = self.request.query("include_chat", include);
638 self
639 }
640
641 pub fn include_template(mut self, include: bool) -> Self {
643 self.request = self.request.query("include_template", include);
644 self
645 }
646
647 pub fn recurrence(mut self, recurrence: impl Into<String>) -> Self {
649 self.request = self.request.query("recurrence", recurrence.into());
650 self
651 }
652
653 pub fn closed(mut self, closed: bool) -> Self {
655 self.request = self.request.query("closed", closed);
656 self
657 }
658
659 pub fn liquidity_min(mut self, min: f64) -> Self {
661 self.request = self.request.query("liquidity_min", min);
662 self
663 }
664
665 pub fn liquidity_max(mut self, max: f64) -> Self {
667 self.request = self.request.query("liquidity_max", max);
668 self
669 }
670
671 pub fn volume_min(mut self, min: f64) -> Self {
673 self.request = self.request.query("volume_min", min);
674 self
675 }
676
677 pub fn volume_max(mut self, max: f64) -> Self {
679 self.request = self.request.query("volume_max", max);
680 self
681 }
682
683 pub fn start_date_min(mut self, date: impl Into<String>) -> Self {
685 self.request = self.request.query("start_date_min", date.into());
686 self
687 }
688
689 pub fn start_date_max(mut self, date: impl Into<String>) -> Self {
691 self.request = self.request.query("start_date_max", date.into());
692 self
693 }
694
695 pub fn end_date_min(mut self, date: impl Into<String>) -> Self {
697 self.request = self.request.query("end_date_min", date.into());
698 self
699 }
700
701 pub fn end_date_max(mut self, date: impl Into<String>) -> Self {
703 self.request = self.request.query("end_date_max", date.into());
704 self
705 }
706
707 pub async fn send(self) -> Result<Vec<Event>, GammaError> {
709 self.request.send().await
710 }
711}
712
713#[cfg(test)]
714mod tests {
715 use crate::Gamma;
716
717 fn gamma() -> Gamma {
718 Gamma::new().unwrap()
719 }
720
721 #[test]
723 fn test_list_events_full_chain() {
724 let _list = gamma()
725 .events()
726 .list()
727 .limit(10)
728 .offset(20)
729 .order("volume")
730 .ascending(true)
731 .id(vec![1i64, 2])
732 .tag_id(42)
733 .exclude_tag_id(vec![99i64])
734 .slug(vec!["slug-a"])
735 .tag_slug("politics")
736 .related_tags(true)
737 .active(true)
738 .archived(false)
739 .featured(true)
740 .cyom(false)
741 .include_chat(true)
742 .include_template(false)
743 .recurrence("daily")
744 .closed(false)
745 .liquidity_min(1000.0)
746 .liquidity_max(50000.0)
747 .volume_min(100.0)
748 .volume_max(10000.0)
749 .start_date_min("2024-01-01")
750 .start_date_max("2025-01-01")
751 .end_date_min("2024-06-01")
752 .end_date_max("2025-12-31");
753 }
754
755 #[test]
756 fn test_get_event_accepts_str_and_string() {
757 let _req1 = gamma().events().get("evt-123");
758 let _req2 = gamma().events().get(String::from("evt-123"));
759 }
760
761 #[test]
762 fn test_get_by_slug_accepts_str_and_string() {
763 let _req1 = gamma().events().get_by_slug("slug");
764 let _req2 = gamma().events().get_by_slug(String::from("slug"));
765 }
766
767 #[test]
768 fn test_get_event_with_query_params() {
769 let _req = gamma()
770 .events()
771 .get("evt-123")
772 .include_chat(true)
773 .include_template(false);
774 }
775
776 #[test]
777 fn test_event_tags_accepts_str_and_string() {
778 let _req1 = gamma().events().tags("evt-123");
779 let _req2 = gamma().events().tags(String::from("evt-123"));
780 }
781
782 #[test]
783 fn test_event_tweet_count() {
784 let _req = gamma().events().tweet_count("evt-123");
785 }
786
787 #[test]
788 fn test_event_comment_count() {
789 let _req = gamma().events().comment_count("evt-123");
790 }
791
792 #[test]
793 fn test_list_creators_full_chain() {
794 let _req = gamma()
795 .events()
796 .list_creators()
797 .limit(10)
798 .offset(0)
799 .order("createdAt")
800 .ascending(true)
801 .creator_name("poly")
802 .creator_handle("polymarket");
803 }
804
805 #[test]
806 fn test_get_creator_accepts_str_and_string() {
807 let _req1 = gamma().events().get_creator("c-1");
808 let _req2 = gamma().events().get_creator(String::from("c-1"));
809 }
810
811 #[test]
812 fn test_list_paginated_full_chain() {
813 let _req = gamma()
814 .events()
815 .list_paginated()
816 .limit(25)
817 .offset(50)
818 .order("startDate")
819 .ascending(false)
820 .include_chat(false)
821 .include_template(true)
822 .recurrence("daily");
823 }
824
825 #[test]
826 fn test_list_results_full_chain() {
827 let _req = gamma()
828 .events()
829 .list_results()
830 .limit(5)
831 .offset(0)
832 .order("endDate")
833 .ascending(true);
834 }
835
836 #[test]
837 fn test_list_keyset_full_chain() {
838 let _req = gamma()
839 .events()
840 .list_keyset()
841 .limit(50)
842 .order("volume_num")
843 .ascending(true)
844 .after_cursor("abc")
845 .id(vec![1i64, 2])
846 .slug(vec!["slug-a"])
847 .closed(false)
848 .live(true)
849 .featured(true)
850 .title_search("bitcoin")
851 .tag_id(vec![42i64])
852 .tag_slug("politics")
853 .liquidity_min(0.0)
854 .liquidity_max(1e6)
855 .volume_min(0.0)
856 .volume_max(1e6);
857 }
858}