25
25
--- In case of name or value clashing, the call will fail. For this reason, it's
26
26
--- best if you define the members in ascending order.
27
27
--- @brief ]]
28
+ --- @class PlenaryEnumEnum
29
+ --- @field [ integer] string
30
+ --- @field [ string] PlenaryVariant
28
31
local Enum = {}
29
32
30
- --- @class Enum
31
-
32
- --- @class Variant
33
-
33
+ --- @param name string
34
+ --- @return string
34
35
local function validate_member_name (name )
35
36
if # name > 0 and name :sub (1 , 1 ):match " %u" then
36
37
return name
46
47
--- {'Qux', 10}
47
48
--- }
48
49
--- </pre>
49
- --- @return Enum : A new enum
50
+ --- @param tbl (string |{ [1] : string , [2] : integer } )[]
51
+ --- @return PlenaryEnumEnum : A new enum
50
52
local function make_enum (tbl )
53
+ --- @type PlenaryEnumEnum
51
54
local enum = {}
52
55
56
+ --- @class PlenaryVariant
57
+ --- @field private value integer
53
58
local Variant = {}
54
59
Variant .__index = Variant
55
60
61
+ --- @param i integer
62
+ --- @return PlenaryVariant
56
63
local function newVariant (i )
57
64
return setmetatable ({ value = i }, Variant )
58
65
end
59
66
60
67
-- we don't need __eq because the __eq metamethod will only ever be
61
68
-- invoked when they both have the same metatable
62
69
70
+ --- @param o PlenaryVariant
71
+ --- @return boolean
63
72
function Variant :__lt (o )
64
73
return self .value < o .value
65
74
end
66
75
76
+ --- @param o PlenaryVariant
77
+ --- @return boolean
67
78
function Variant :__gt (o )
68
79
return self .value > o .value
69
80
end
70
81
82
+ --- @return string
71
83
function Variant :__tostring ()
72
84
return tostring (self .value )
73
85
end
74
86
87
+ --- @param e PlenaryEnumEnum
88
+ --- @param i integer
89
+ --- @return integer
75
90
local function find_next_idx (e , i )
76
91
local newI = i + 1
77
92
if not e [newI ] then
@@ -112,6 +127,9 @@ local function make_enum(tbl)
112
127
return require (" plenary.tbl" ).freeze (setmetatable (enum , Enum ))
113
128
end
114
129
130
+ --- @param _ PlenaryEnumEnum
131
+ --- @param key string | integer
132
+ --- @return string | PlenaryVariant
115
133
Enum .__index = function (_ , key )
116
134
if Enum [key ] then
117
135
return Enum [key ]
@@ -120,8 +138,8 @@ Enum.__index = function(_, key)
120
138
end
121
139
122
140
--- Checks whether the enum has a member with the given name
123
- --- @param key string : The element to check for
124
- --- @return boolean : True if key is present
141
+ --- @param key string The element to check for
142
+ --- @return boolean has_key True if key is present
125
143
function Enum :has_key (key )
126
144
if rawget (getmetatable (self ).__index , key ) then
127
145
return true
@@ -130,17 +148,17 @@ function Enum:has_key(key)
130
148
end
131
149
132
150
--- If there is a member named 'key', return it, otherwise return nil
133
- --- @param key string : The element to check for
134
- --- @return Variant : The element named by key , or nil if not present
151
+ --- @param key string The element to check for
152
+ --- @return PlenaryVariant ? variant The element named by key, or nil if not present
135
153
function Enum :from_str (key )
136
154
if self :has_key (key ) then
137
155
return self [key ]
138
156
end
139
157
end
140
158
141
159
--- If there is a member of value 'num', return it, otherwise return nil
142
- --- @param num number : The value of the element to check for
143
- --- @return Variant : The element whose value is num
160
+ --- @param num integer The value of the element to check for
161
+ --- @return string ? name The element whose value is num
144
162
function Enum :from_num (num )
145
163
local key = self [num ]
146
164
if key then
@@ -149,14 +167,17 @@ function Enum:from_num(num)
149
167
end
150
168
151
169
--- Checks whether the given object corresponds to an instance of Enum
152
- --- @param tbl table : The object to be checked
153
- --- @return boolean : True if tbl is an Enum
170
+ --- @param tbl table The object to be checked
171
+ --- @return boolean is_enum True if tbl is an Enum
154
172
local function is_enum (tbl )
155
173
return getmetatable (getmetatable (tbl ).__index ) == Enum
156
174
end
157
175
176
+ --- @class PlenaryEnum
177
+ --- @field is_enum ` is_enum`
178
+
158
179
return setmetatable ({ is_enum = is_enum , make_enum = make_enum }, {
159
180
__call = function (_ , tbl )
160
181
return make_enum (tbl )
161
182
end ,
162
- })
183
+ }) --[[ @as PlenaryEnum ]]
0 commit comments