Repository navigation
Expand file tree
/
Copy pathEnum.lua
More file actions
123 lines (113 loc) · 3.37 KB
/
Copy pathEnum.lua
File metadata and controls
123 lines (113 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
--[[
Copyright 2017 YANG Huan ([email protected]).
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--]]
local System = System
local throw = System.throw
local Int = System.Int
local Number = System.Number
local band = System.band
local ArgumentNullException = System.ArgumentNullException
local ArgumentException = System.ArgumentException
local pairs = pairs
local tostring = tostring
local function toString(this, cls)
if cls then
for k, v in pairs(cls) do
if v == this then
return k
end
end
end
return tostring(this)
end
local function hasFlag(this, flag)
return band(this, flag) ~= 0
end
Number.ToEnumString = toString
Number.HasFlag = hasFlag
local function tryParseEnum(enumType, value, ignoreCase)
if enumType == nil then throw(ArgumentNullException("enumType")) end
if not enumType:getIsEnum() then throw(ArgumentException("Arg_MustBeEnum")) end
if value == nil then
return
end
value = value:Trim()
if #value == 0 then
return
end
if ignoreCase then
value = value:lower()
end
for k, v in pairs(enumType[1]) do
if ignoreCase then
k = k:lower()
end
if k == value then
return v
end
end
end
System.define("System.Enum", {
CompareToObj = Int.CompareToObj,
EqualsObj = Int.EqualsObj,
default = Int.default,
ToString = toString,
ToEnumString = toString,
HasFlag = hasFlag,
GetName = function (enumType, value)
if enumType == nil then throw(ArgumentNullException("enumType")) end
if value == nil then throw(ArgumentNullException("value")) end
if not enumType:getIsEnum() then throw(ArgumentException("Arg_MustBeEnum")) end
for k, v in pairs(enumType[1]) do
if v == value then
return k
end
end
throw(ArgumentException())
end,
GetNames = function (enumType)
if enumType == nil then throw(ArgumentNullException("enumType")) end
if not enumType:getIsEnum() then throw(ArgumentException("Arg_MustBeEnum")) end
local t = {}
local count = 1
for k, v in pairs(enumType[1]) do
t[count] = k
count = count + 1
end
return System.arrayFromTable(t, System.String)
end,
GetValues = function (enumType)
if enumType == nil then throw(ArgumentNullException("enumType")) end
if not enumType:getIsEnum() then throw(ArgumentException("Arg_MustBeEnum")) end
local t = {}
local count = 1
for k, v in pairs(enumType[1]) do
t[count] = v
count = count + 1
end
return System.arrayFromTable(t, Int)
end,
Parse = function (enumType, value, ignoreCase)
local result = tryParseEnum(enumType, value, ignoreCase)
if result == nil then
throw(ArgumentException("parse enum fail: ".. value))
end
return result
end,
TryParse = function (TEnum, value, ignoreCase)
local result = tryParseEnum(System.typeof(TEnum), value, ignoreCase)
if result == nil then
return false, 0
end
return true, result
end
})