boseiju/lexer/tokens/intermediates/
player_specifier.rs1use crate::lexer::IntoToken;
2
3#[derive(idris_derive::Idris)]
5#[derive(serde::Serialize, serde::Deserialize)]
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
7pub enum PlayerSpecifier {
8 All {
9 #[cfg(feature = "spanned_tree")]
10 span: crate::ability_tree::span::TreeSpan,
11 },
12 Any {
13 #[cfg(feature = "spanned_tree")]
14 span: crate::ability_tree::span::TreeSpan,
15 },
16 Controller {
17 #[cfg(feature = "spanned_tree")]
18 span: crate::ability_tree::span::TreeSpan,
19 },
20 DefendingPlayer {
21 #[cfg(feature = "spanned_tree")]
22 span: crate::ability_tree::span::TreeSpan,
23 },
24 EachOpponent {
25 #[cfg(feature = "spanned_tree")]
26 span: crate::ability_tree::span::TreeSpan,
27 },
28 TargetOpponent {
29 #[cfg(feature = "spanned_tree")]
30 span: crate::ability_tree::span::TreeSpan,
31 },
32 Owner {
33 #[cfg(feature = "spanned_tree")]
34 span: crate::ability_tree::span::TreeSpan,
35 },
36 ToYourLeft {
37 #[cfg(feature = "spanned_tree")]
38 span: crate::ability_tree::span::TreeSpan,
39 },
40 ToYourRight {
41 #[cfg(feature = "spanned_tree")]
42 span: crate::ability_tree::span::TreeSpan,
43 },
44 You {
45 #[cfg(feature = "spanned_tree")]
46 span: crate::ability_tree::span::TreeSpan,
47 },
48}
49
50#[cfg(feature = "spanned_tree")]
51impl PlayerSpecifier {
52 pub fn span(&self) -> crate::ability_tree::span::TreeSpan {
53 match self {
54 Self::All { span } => *span,
55 Self::Any { span } => *span,
56 Self::Controller { span } => *span,
57 Self::DefendingPlayer { span } => *span,
58 Self::EachOpponent { span } => *span,
59 Self::Owner { span } => *span,
60 Self::TargetOpponent { span } => *span,
61 Self::ToYourLeft { span } => *span,
62 Self::ToYourRight { span } => *span,
63 Self::You { span } => *span,
64 }
65 }
66}
67
68impl IntoToken for PlayerSpecifier {
69 #[cfg(feature = "lexer")]
70 fn try_from_span(span: &crate::lexer::Span) -> Option<Self> {
71 match span.text {
72 "each player" | "players" => Some(Self::All {
73 #[cfg(feature = "spanned_tree")]
74 span: span.into(),
75 }),
76 "an opponent" | "a player" => Some(Self::Any {
77 #[cfg(feature = "spanned_tree")]
78 span: span.into(),
79 }),
80 "controller" => Some(Self::Controller {
81 #[cfg(feature = "spanned_tree")]
82 span: span.into(),
83 }),
84 "defending player" => Some(Self::DefendingPlayer {
85 #[cfg(feature = "spanned_tree")]
86 span: span.into(),
87 }),
88 "each opponent" | "opponents" | "your opponents" => Some(Self::EachOpponent {
89 #[cfg(feature = "spanned_tree")]
90 span: span.into(),
91 }),
92 "owner" => Some(Self::Owner {
93 #[cfg(feature = "spanned_tree")]
94 span: span.into(),
95 }),
96 "target opponent" | "target player" | "target players" => Some(Self::TargetOpponent {
97 #[cfg(feature = "spanned_tree")]
98 span: span.into(),
99 }),
100 "the player to your left" => Some(Self::ToYourLeft {
101 #[cfg(feature = "spanned_tree")]
102 span: span.into(),
103 }),
104 "the player to your right" => Some(Self::ToYourRight {
105 #[cfg(feature = "spanned_tree")]
106 span: span.into(),
107 }),
108 "you" => Some(Self::You {
109 #[cfg(feature = "spanned_tree")]
110 span: span.into(),
111 }),
112 _ => None,
113 }
114 }
115}