2019-08-23 11:56:54 -07:00
|
|
|
using System.Reflection;
|
2021-12-27 14:34:55 -05:00
|
|
|
using System.Collections;
|
2019-08-23 11:56:54 -07:00
|
|
|
|
|
|
|
namespace System
|
|
|
|
{
|
|
|
|
struct Enum
|
|
|
|
{
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2022-11-22 17:17:14 -03:00
|
|
|
public static int GetCount(Type type)
|
2022-06-23 11:53:21 -07:00
|
|
|
{
|
2022-06-23 13:37:15 -07:00
|
|
|
int count = 0;
|
2022-11-22 17:17:14 -03:00
|
|
|
for (var field in type.GetFields())
|
2022-06-23 11:53:21 -07:00
|
|
|
{
|
2022-06-23 13:37:15 -07:00
|
|
|
if (field.IsEnumCase)
|
|
|
|
count++;
|
2022-06-23 11:53:21 -07:00
|
|
|
}
|
2022-06-23 13:37:15 -07:00
|
|
|
return count;
|
2022-06-23 11:53:21 -07:00
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2022-06-23 13:37:15 -07:00
|
|
|
[Comptime(ConstEval=true)]
|
2022-11-22 17:17:14 -03:00
|
|
|
public static int GetCount<T>() where T : Enum
|
2022-06-23 11:53:21 -07:00
|
|
|
{
|
2022-11-22 17:17:14 -03:00
|
|
|
return GetCount(typeof(T));
|
|
|
|
}
|
2022-06-23 11:53:21 -07:00
|
|
|
|
2022-11-22 17:17:14 -03:00
|
|
|
[NoShow(true)]
|
|
|
|
public static int64 GetMinValue(Type type)
|
|
|
|
{
|
|
|
|
int64? minValue = null;
|
|
|
|
for (var data in GetValues(type))
|
2022-06-23 13:37:15 -07:00
|
|
|
{
|
2022-11-22 17:17:14 -03:00
|
|
|
if (minValue == null)
|
|
|
|
minValue = data;
|
|
|
|
else
|
|
|
|
minValue = Math.Min(minValue.Value, data);
|
2022-06-23 11:53:21 -07:00
|
|
|
}
|
2022-06-23 13:37:15 -07:00
|
|
|
return minValue.ValueOrDefault;
|
2022-06-23 11:53:21 -07:00
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2022-06-23 13:37:15 -07:00
|
|
|
[Comptime(ConstEval=true)]
|
2022-11-22 17:17:14 -03:00
|
|
|
public static var GetMinValue<T>() where T : Enum
|
2022-06-23 11:53:21 -07:00
|
|
|
{
|
2022-06-24 06:45:35 -07:00
|
|
|
Compiler.SetReturnType(typeof(T));
|
2022-11-22 17:17:14 -03:00
|
|
|
return GetMinValue(typeof(T));
|
|
|
|
}
|
2022-06-23 11:53:21 -07:00
|
|
|
|
2022-11-22 17:17:14 -03:00
|
|
|
[NoShow(true)]
|
|
|
|
public static int64 GetMaxValue(Type type)
|
|
|
|
{
|
|
|
|
int64? maxValue = null;
|
|
|
|
for (var data in GetValues(type))
|
2022-06-23 13:37:15 -07:00
|
|
|
{
|
2022-11-22 17:17:14 -03:00
|
|
|
if (maxValue == null)
|
|
|
|
maxValue = data;
|
|
|
|
else
|
|
|
|
maxValue = Math.Max(maxValue.Value, data);
|
2022-06-23 11:53:21 -07:00
|
|
|
}
|
2022-11-22 17:17:14 -03:00
|
|
|
return maxValue ?? -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
[NoShow(true)]
|
|
|
|
[Comptime(ConstEval=true)]
|
|
|
|
public static var GetMaxValue<T>() where T : Enum
|
|
|
|
{
|
|
|
|
Compiler.SetReturnType(typeof(T));
|
|
|
|
return GetMaxValue(typeof(T));
|
2022-06-23 11:53:21 -07:00
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2019-08-23 11:56:54 -07:00
|
|
|
public static void EnumToString(Type type, String strBuffer, int64 iVal)
|
|
|
|
{
|
2022-11-22 17:17:14 -03:00
|
|
|
for (var (name, data) in GetEnumerator(type))
|
2019-08-23 11:56:54 -07:00
|
|
|
{
|
2022-11-22 17:17:14 -03:00
|
|
|
if (data == iVal)
|
2019-08-23 11:56:54 -07:00
|
|
|
{
|
2022-11-22 17:17:14 -03:00
|
|
|
strBuffer.Append(name);
|
2019-08-23 11:56:54 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2021-12-29 11:24:14 -05:00
|
|
|
iVal.ToString(strBuffer);
|
2019-08-23 11:56:54 -07:00
|
|
|
}
|
|
|
|
|
2022-11-22 17:17:14 -03:00
|
|
|
[NoShow(true)]
|
|
|
|
public static Result<int64> Parse(Type type, StringView str, bool ignoreCase = false)
|
|
|
|
{
|
|
|
|
for (var (name, data) in GetEnumerator(type))
|
|
|
|
{
|
|
|
|
if (str.Equals(name, ignoreCase))
|
|
|
|
return .Ok(data);
|
|
|
|
if (int64.Parse(str) case .Ok(let val) && val == data)
|
|
|
|
return .Ok(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
return .Err;
|
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2020-11-10 05:44:23 -08:00
|
|
|
public static Result<T> Parse<T>(StringView str, bool ignoreCase = false) where T : enum
|
2019-08-23 11:56:54 -07:00
|
|
|
{
|
2024-02-27 10:54:07 -05:00
|
|
|
return EnumParser<T>.Parse(str, ignoreCase);
|
2019-08-23 11:56:54 -07:00
|
|
|
}
|
|
|
|
|
2022-11-22 17:17:14 -03:00
|
|
|
[NoShow(true)]
|
|
|
|
public static bool IsDefined(Type type, int64 value)
|
|
|
|
{
|
|
|
|
for (var data in GetValues(type))
|
|
|
|
{
|
|
|
|
if (data == value)
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
|
|
|
public static bool IsDefined<T>(T value) where T : Enum
|
2021-12-27 13:45:52 -03:00
|
|
|
where T : enum
|
2019-08-23 11:56:54 -07:00
|
|
|
{
|
2021-12-29 12:44:04 -03:00
|
|
|
for (var data in GetValues<T>())
|
2021-12-27 13:45:52 -03:00
|
|
|
{
|
2021-12-29 12:44:04 -03:00
|
|
|
if (data == (.)value)
|
2021-12-27 13:45:52 -03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-11-22 17:17:14 -03:00
|
|
|
[NoShow(true)]
|
|
|
|
public static EnumEnumerator GetEnumerator(Type type)
|
|
|
|
{
|
|
|
|
return .(type);
|
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2021-12-27 14:34:55 -05:00
|
|
|
public static EnumEnumerator<TEnum> GetEnumerator<TEnum>()
|
|
|
|
where TEnum : enum
|
|
|
|
{
|
|
|
|
return .();
|
|
|
|
}
|
|
|
|
|
2022-11-22 17:17:14 -03:00
|
|
|
[NoShow(true)]
|
|
|
|
public static EnumValuesEnumerator GetValues(Type type)
|
|
|
|
{
|
|
|
|
return .(type);
|
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2021-12-27 14:34:55 -05:00
|
|
|
public static EnumValuesEnumerator<TEnum> GetValues<TEnum>()
|
2021-12-27 13:45:52 -03:00
|
|
|
where TEnum : enum
|
|
|
|
{
|
|
|
|
return .();
|
|
|
|
}
|
2022-06-24 06:45:35 -07:00
|
|
|
|
2022-11-22 17:17:14 -03:00
|
|
|
[NoShow(true)]
|
|
|
|
public static EnumNamesEnumerator GetNames(Type type)
|
|
|
|
{
|
|
|
|
return .(type);
|
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2021-12-27 14:34:55 -05:00
|
|
|
public static EnumNamesEnumerator<TEnum> GetNames<TEnum>()
|
2021-12-27 13:45:52 -03:00
|
|
|
where TEnum : enum
|
|
|
|
{
|
|
|
|
return .();
|
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2022-11-22 17:17:14 -03:00
|
|
|
private struct EnumFieldsEnumerator
|
2021-12-27 13:45:52 -03:00
|
|
|
{
|
2021-12-27 16:06:05 -03:00
|
|
|
TypeInstance mTypeInstance;
|
|
|
|
int32 mIdx;
|
2021-12-27 13:45:52 -03:00
|
|
|
|
2022-11-22 17:17:14 -03:00
|
|
|
public this(Type type)
|
2021-12-27 13:45:52 -03:00
|
|
|
{
|
2022-11-22 17:17:14 -03:00
|
|
|
mTypeInstance = type as TypeInstance;
|
2021-12-27 16:06:05 -03:00
|
|
|
mIdx = -1;
|
2021-12-27 13:45:52 -03:00
|
|
|
}
|
|
|
|
|
2021-12-27 16:06:05 -03:00
|
|
|
public void Reset() mut
|
2021-12-27 13:45:52 -03:00
|
|
|
{
|
2021-12-27 16:06:05 -03:00
|
|
|
mIdx = -1;
|
2021-12-27 13:45:52 -03:00
|
|
|
}
|
|
|
|
|
2021-12-27 16:06:05 -03:00
|
|
|
public void Dispose()
|
2021-12-27 13:45:52 -03:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2021-12-27 16:06:05 -03:00
|
|
|
public bool MoveNext() mut
|
2021-12-27 13:45:52 -03:00
|
|
|
{
|
2021-12-27 16:06:05 -03:00
|
|
|
if (mTypeInstance == null)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
TypeInstance.FieldData* fieldData = null;
|
|
|
|
|
|
|
|
repeat
|
2021-12-27 13:45:52 -03:00
|
|
|
{
|
2021-12-27 16:06:05 -03:00
|
|
|
mIdx++;
|
|
|
|
if (mIdx == mTypeInstance.[Friend]mFieldDataCount)
|
|
|
|
return false;
|
|
|
|
fieldData = &mTypeInstance.[Friend]mFieldDataPtr[mIdx];
|
2021-12-27 13:45:52 -03:00
|
|
|
}
|
2021-12-27 16:06:05 -03:00
|
|
|
while (!fieldData.mFlags.HasFlag(.EnumCase));
|
|
|
|
|
|
|
|
return true;
|
2021-12-27 13:45:52 -03:00
|
|
|
}
|
|
|
|
|
2021-12-27 16:06:05 -03:00
|
|
|
public FieldInfo Current
|
2021-12-27 13:45:52 -03:00
|
|
|
{
|
2021-12-27 16:06:05 -03:00
|
|
|
get
|
|
|
|
{
|
|
|
|
var fieldData = &mTypeInstance.[Friend]mFieldDataPtr[mIdx];
|
|
|
|
return FieldInfo(mTypeInstance, fieldData);
|
|
|
|
}
|
2021-12-27 13:45:52 -03:00
|
|
|
}
|
|
|
|
|
2021-12-27 16:06:05 -03:00
|
|
|
public int32 Index
|
2021-12-27 13:45:52 -03:00
|
|
|
{
|
2021-12-27 16:06:05 -03:00
|
|
|
get
|
|
|
|
{
|
|
|
|
return mIdx;
|
|
|
|
}
|
2021-12-27 13:45:52 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
public Result<FieldInfo> GetNext() mut
|
|
|
|
{
|
|
|
|
if (!MoveNext())
|
|
|
|
return .Err;
|
|
|
|
return Current;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2022-11-22 17:17:14 -03:00
|
|
|
public struct EnumEnumerator : EnumFieldsEnumerator, IEnumerator<(StringView name, int64 value)>
|
|
|
|
{
|
|
|
|
public this(Type type) : base(type)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
public new (StringView name, int64 value) Current
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return ((.)base.Current.[Friend]mFieldData.[Friend]mName, *(int64*)&base.Current.[Friend]mFieldData.[Friend]mData);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public new Result<(StringView name, int64 value)> GetNext() mut
|
|
|
|
{
|
|
|
|
if (!MoveNext())
|
|
|
|
return .Err;
|
|
|
|
return Current;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[NoShow(true)]
|
|
|
|
public struct EnumEnumerator<TEnum> : EnumFieldsEnumerator, IEnumerator<(StringView name, TEnum value)>
|
2021-12-27 14:34:55 -05:00
|
|
|
where TEnum : enum
|
|
|
|
{
|
2022-11-22 17:17:14 -03:00
|
|
|
public this() : base(typeof(TEnum))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2021-12-27 14:34:55 -05:00
|
|
|
public new (StringView name, TEnum value) Current
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
2021-12-29 13:01:13 -05:00
|
|
|
return ((.)base.Current.[Friend]mFieldData.[Friend]mName, (.)*(int64*)&base.Current.[Friend]mFieldData.[Friend]mData);
|
2021-12-27 14:34:55 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public new Result<(StringView name, TEnum value)> GetNext() mut
|
|
|
|
{
|
|
|
|
if (!MoveNext())
|
|
|
|
return .Err;
|
|
|
|
return Current;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2022-11-22 17:17:14 -03:00
|
|
|
public struct EnumValuesEnumerator : EnumFieldsEnumerator, IEnumerator<int64>
|
|
|
|
{
|
|
|
|
public this(Type type) : base(type)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
public new int64 Current
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return *(int64*)&base.Current.[Friend]mFieldData.[Friend]mData;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public new Result<int64> GetNext() mut
|
|
|
|
{
|
|
|
|
if (!MoveNext())
|
|
|
|
return .Err;
|
|
|
|
return Current;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[NoShow(true)]
|
|
|
|
public struct EnumValuesEnumerator<TEnum> : EnumFieldsEnumerator, IEnumerator<TEnum>
|
2021-12-27 13:45:52 -03:00
|
|
|
where TEnum : enum
|
|
|
|
{
|
2022-11-22 17:17:14 -03:00
|
|
|
public this() : base(typeof(TEnum))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2021-12-27 13:45:52 -03:00
|
|
|
public new TEnum Current
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
2021-12-29 13:01:13 -05:00
|
|
|
return (.)*(int64*)&base.Current.[Friend]mFieldData.[Friend]mData;
|
2021-12-27 13:45:52 -03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public new Result<TEnum> GetNext() mut
|
|
|
|
{
|
|
|
|
if (!MoveNext())
|
|
|
|
return .Err;
|
|
|
|
return Current;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-24 06:45:35 -07:00
|
|
|
[NoShow(true)]
|
2022-11-22 17:17:14 -03:00
|
|
|
public struct EnumNamesEnumerator : EnumFieldsEnumerator, IEnumerator<StringView>
|
|
|
|
{
|
|
|
|
public this(Type type) : base(type)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
public new StringView Current
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return (.)base.Current.[Friend]mFieldData.[Friend]mName;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public new Result<StringView> GetNext() mut
|
|
|
|
{
|
|
|
|
if (!MoveNext())
|
|
|
|
return .Err;
|
|
|
|
return Current;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[NoShow(true)]
|
|
|
|
public struct EnumNamesEnumerator<TEnum> : EnumFieldsEnumerator, IEnumerator<StringView>
|
2021-12-27 13:45:52 -03:00
|
|
|
where TEnum : enum
|
|
|
|
{
|
2022-11-22 17:17:14 -03:00
|
|
|
public this() : base(typeof(TEnum))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2021-12-27 13:45:52 -03:00
|
|
|
public new StringView Current
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return (.)base.Current.[Friend]mFieldData.[Friend]mName;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public new Result<StringView> GetNext() mut
|
|
|
|
{
|
|
|
|
if (!MoveNext())
|
|
|
|
return .Err;
|
|
|
|
return Current;
|
|
|
|
}
|
|
|
|
}
|
2019-08-23 11:56:54 -07:00
|
|
|
}
|
2024-02-27 10:54:07 -05:00
|
|
|
|
|
|
|
class EnumParser<T>
|
|
|
|
{
|
|
|
|
[OnCompile(.TypeInit), Comptime]
|
|
|
|
public static void OnTypeInit()
|
|
|
|
{
|
|
|
|
String code = scope .();
|
|
|
|
|
|
|
|
code.Append("public static Result<T> Parse(StringView str, bool ignoreCase = false)\n");
|
|
|
|
code.Append("{\n");
|
|
|
|
|
|
|
|
Type dscrType = typeof(int);
|
|
|
|
int dscrOffset = 0;
|
|
|
|
for (var fieldInfo in typeof(T).GetFields())
|
|
|
|
{
|
|
|
|
if (fieldInfo.Name == "$discriminator")
|
|
|
|
{
|
|
|
|
dscrOffset = fieldInfo.MemberOffset;
|
|
|
|
dscrType = fieldInfo.FieldType;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool hadPayload = false;
|
|
|
|
|
|
|
|
for (var fieldInfo in typeof(T).GetFields())
|
|
|
|
{
|
|
|
|
if (var fieldTypeInst = fieldInfo.FieldType as TypeInstance)
|
|
|
|
{
|
|
|
|
if ((fieldTypeInst.IsTuple) && (fieldTypeInst.FieldCount > 0))
|
|
|
|
{
|
|
|
|
code.Append("\tT result = default;\n");
|
|
|
|
hadPayload = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int caseIdx = 0;
|
|
|
|
for (var fieldInfo in typeof(T).GetFields())
|
|
|
|
{
|
|
|
|
if (!fieldInfo.IsEnumCase)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (var fieldTypeInst = fieldInfo.FieldType as TypeInstance)
|
|
|
|
{
|
|
|
|
bool hasPayload = (fieldTypeInst.IsTuple) && (fieldTypeInst.FieldCount > 0);
|
|
|
|
if (caseIdx == 0)
|
|
|
|
code.Append("\t");
|
|
|
|
else
|
|
|
|
code.Append("\telse ");
|
|
|
|
if (!hasPayload)
|
|
|
|
{
|
|
|
|
code.AppendF($"if (str.Equals(\"{fieldInfo.Name}\", ignoreCase))\n\t\treturn .Ok(.{fieldInfo.Name});\n");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
code.AppendF($"if (str.StartsWith(\"{fieldInfo.Name}(\", ignoreCase ? .OrdinalIgnoreCase : .Ordinal))\n\t{{\n");
|
|
|
|
code.AppendF($"\t\t*({dscrType}*)((uint8*)&result + {dscrOffset}) = {fieldInfo.MemberOffset};\n");
|
|
|
|
code.AppendF($"\t\tvar itr = Try!(EnumFields(str.Substring({fieldInfo.Name.Length+1})));\n");
|
|
|
|
for (var tupField in fieldTypeInst.GetFields())
|
|
|
|
code.AppendF($"\t\tTry!(ParseValue(ref itr, ref *({tupField.FieldType}*)((uint8*)&result + {tupField.MemberOffset})));\n");
|
|
|
|
code.Append("\t}\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
caseIdx++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (caseIdx == 0)
|
|
|
|
{
|
|
|
|
code.Append("\treturn .Err;\n");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
code.Append("\telse\n\t\treturn .Err;\n");
|
|
|
|
if (hadPayload)
|
|
|
|
code.Append("\treturn result;\n");
|
|
|
|
}
|
|
|
|
code.Append("}\n");
|
|
|
|
|
|
|
|
Compiler.EmitTypeBody(typeof(Self), code);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Result<StringSplitEnumerator> EnumFields(StringView str)
|
|
|
|
{
|
|
|
|
var str;
|
|
|
|
str.Trim();
|
|
|
|
if (!str.EndsWith(')'))
|
|
|
|
return .Err;
|
|
|
|
str.RemoveFromEnd(1);
|
|
|
|
return str.Split(',');
|
|
|
|
}
|
|
|
|
|
|
|
|
static Result<void> ParseValue<TValue>(ref StringSplitEnumerator itr, ref TValue value)
|
|
|
|
{
|
|
|
|
return .Err;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Result<void> ParseValue<TValue>(ref StringSplitEnumerator itr, ref TValue value) where TValue : IParseable<TValue>
|
|
|
|
{
|
|
|
|
var str = Try!(itr.GetNext());
|
|
|
|
str.Trim();
|
|
|
|
value = Try!(TValue.Parse(str));
|
|
|
|
return .Ok;
|
|
|
|
}
|
|
|
|
}
|
2019-08-23 11:56:54 -07:00
|
|
|
}
|