Skip to content

Commit 2e24a3a

Browse files
Tweaks, cleanup, better docs, and added addition implict conversion for EnumValue and EnumValueCaseIgnored.
1 parent 60d6daf commit 2e24a3a

2 files changed

Lines changed: 64 additions & 54 deletions

File tree

Source/EnumValue.cs

Lines changed: 63 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
namespace Open.Text;
1616

1717
/// <summary>
18-
/// A case struct representing an enum value that can be implicitly coerced from a string.
18+
/// A struct representing an enum value that can be implicitly coerced from a string.
1919
/// </summary>
2020
/// <remarks>String parsing or coercion is case sensitive and must be exact.</remarks>
2121
[SuppressMessage("Usage", "CA2225:Operator overloads have named alternates", Justification = "Already exposes via a property.")]
@@ -35,29 +35,25 @@ public readonly struct EnumValue<TEnum>
3535
public static Type UnderlyingType => _underlyingType ??= Enum.GetUnderlyingType(typeof(TEnum));
3636

3737
/// <summary>
38-
/// Constructs an EnumValue&lt;<typeparamref name="TEnum"/>&gt; using the provided enum value.
38+
/// Constructs an <see cref="EnumValue{TEnum}"/> using the provided <typeparamref name="TEnum"/> value.
3939
/// </summary>
4040
public EnumValue(TEnum value)
41-
{
42-
Value = value;
43-
}
41+
=> Value = value;
4442

4543
/// <summary>
46-
/// Parses the string value to construct an EnumValue&lt;<typeparamref name="TEnum"/>&gt; instance.
44+
/// Parses the <paramref name="value"/> to construct an <see cref="EnumValue{TEnum}"/>.
4745
/// </summary>
4846
/// <exception cref="ArgumentNullException">value is null.</exception>
4947
public EnumValue(StringSegment value)
50-
{
51-
Value = EnumValue.Parse<TEnum>(value);
52-
}
48+
=> Value = EnumValue.Parse<TEnum>(value);
5349

5450
/// <summary>
55-
/// The enum value that this represents.
51+
/// The <typeparamref name="TEnum"/> value that this represents.
5652
/// </summary>
5753
public readonly TEnum Value { get; }
5854

5955
/// <summary>
60-
/// Returns the string representation of the enum value.
56+
/// Returns the <see cref="string"/> representation of the enum value.
6157
/// </summary>
6258
[MethodImpl(MethodImplOptions.AggressiveInlining)]
6359
public override string ToString() => NameLookup(Value);
@@ -264,49 +260,58 @@ internal static Entry[]?[] Lookup
264260
() => CreateLookup())!;
265261

266262
/// <summary>
267-
/// Indicates whether this instance matches the enum value of <paramref name="other"/>.
263+
/// Indicates whether this instance matches the <typeparamref name="TEnum"/> value of <paramref name="other"/>.
268264
/// </summary>
269-
/// <returns>true if <paramref name="other"/>'s enum value and this instance's enum value are the same; otherwise false.</returns>
270-
public bool Equals(EnumValue<TEnum> other) => Value.Equals(other.Value);
265+
/// <returns>true if <paramref name="other"/>'s <typeparamref name="TEnum"/> value and this instance's <typeparamref name="TEnum"/> value are the same; otherwise false.</returns>
266+
public bool Equals(EnumValue<TEnum> other)
267+
=> Value.Equals(other.Value);
271268

272269
/// <summary>
273-
/// Compares an EnumValue and EnumValueCaseIgnored for enum equality.
270+
/// Compares an <see cref="EnumValue{TEnum}"/> and <see cref="EnumValueCaseIgnored{TEnum}"/> for <typeparamref name="TEnum"/> equality.
274271
/// </summary>
275-
public static bool operator ==(EnumValue<TEnum> left, EnumValue<TEnum> right) => left.Value.Equals(right.Value);
272+
public static bool operator ==(EnumValue<TEnum> left, EnumValue<TEnum> right)
273+
=> left.Value.Equals(right.Value);
276274

277275
/// <summary>
278-
/// Compares an EnumValue and EnumValueCaseIgnored for enum inequality.
276+
/// Compares an <see cref="EnumValue{TEnum}"/> and <see cref="EnumValueCaseIgnored{TEnum}"/> for <typeparamref name="TEnum"/> inequality.
279277
/// </summary>
280-
public static bool operator !=(EnumValue<TEnum> left, EnumValue<TEnum> right) => !left.Value.Equals(right.Value);
278+
public static bool operator !=(EnumValue<TEnum> left, EnumValue<TEnum> right)
279+
=> !left.Value.Equals(right.Value);
281280

282281
/// <inheritdoc cref="Equals(EnumValue{TEnum})"/>
283-
public bool Equals(EnumValueCaseIgnored<TEnum> other) => Value.Equals(other.Value);
282+
public bool Equals(EnumValueCaseIgnored<TEnum> other)
283+
=> Value.Equals(other.Value);
284284

285285
/// <summary>
286-
/// Compares two EnumValue for enum equality.
286+
/// Compares two <see cref="EnumValue{TEnum}"/> for <typeparamref name="TEnum"/> equality.
287287
/// </summary>
288-
public static bool operator ==(EnumValue<TEnum> left, EnumValueCaseIgnored<TEnum> right) => left.Value.Equals(right.Value);
288+
public static bool operator ==(EnumValue<TEnum> left, EnumValueCaseIgnored<TEnum> right)
289+
=> left.Value.Equals(right.Value);
289290

290291
/// <summary>
291-
/// Compares two EnumValue for enum inequality.
292+
/// Compares two <see cref="EnumValue{TEnum}"/> for <typeparamref name="TEnum"/> inequality.
292293
/// </summary>
293-
public static bool operator !=(EnumValue<TEnum> left, EnumValueCaseIgnored<TEnum> right) => !left.Value.Equals(right.Value);
294+
public static bool operator !=(EnumValue<TEnum> left, EnumValueCaseIgnored<TEnum> right)
295+
=> !left.Value.Equals(right.Value);
294296

295297
/// <summary>
296298
/// Indicates whether this instance matches the provided enum <paramref name="other"/>.
297299
/// </summary>
298300
/// <returns>true if <paramref name="other"/> and this instance's enum value are the same; otherwise false.</returns>
299-
public bool Equals(TEnum other) => Value.Equals(other);
301+
public bool Equals(TEnum other)
302+
=> Value.Equals(other);
300303

301304
/// <summary>
302-
/// Compares an EnumValue and an enum value for enum equality.
305+
/// Compares an <see cref="EnumValue{TEnum}"/> and a <typeparamref name="TEnum"/> value forequality.
303306
/// </summary>
304-
public static bool operator ==(EnumValue<TEnum> left, TEnum right) => left.Value.Equals(right);
307+
public static bool operator ==(EnumValue<TEnum> left, TEnum right)
308+
=> left.Value.Equals(right);
305309

306310
/// <summary>
307-
/// Compares an EnumValue and an enum value for enum inequality.
311+
/// Compares an <see cref="EnumValue{TEnum}"/> and a <typeparamref name="TEnum"/> value for inequality.
308312
/// </summary>
309-
public static bool operator !=(EnumValue<TEnum> left, TEnum right) => !left.Value.Equals(right);
313+
public static bool operator !=(EnumValue<TEnum> left, TEnum right)
314+
=> !left.Value.Equals(right);
310315

311316
/// <inheritdoc />
312317
public override bool Equals(object? obj)
@@ -318,23 +323,28 @@ public override bool Equals(object? obj)
318323
public override int GetHashCode() => Value.GetHashCode();
319324

320325
/// <summary>
321-
/// Implicitly converts an EnumValueCaseInsensitive to an EnumValue.
326+
/// Implicitly converts an <see cref="EnumValueCaseIgnored{TEnum}"/> to an <see cref="EnumValue{TEnum}"/>.
322327
/// Before conversion they are already equivalent.
323328
/// </summary>
324329
public static implicit operator EnumValue<TEnum>(EnumValueCaseIgnored<TEnum> value) => new(value.Value);
325330

326331
/// <summary>
327-
/// Implicitly returns the actual enum contained by the EnumValue.
332+
/// Implicitly returns the actual enum contained by the <see cref="EnumValue{TEnum}"/>.
328333
/// </summary>
329334
public static implicit operator TEnum(EnumValue<TEnum> value) => value.Value;
330335

331336
/// <summary>
332-
/// Implicitly converts an string to an EnumValue of enum type TEnum.
337+
/// Implicitly converts an <typeparamref name="TEnum"/> to an <see cref="EnumValue{TEnum}"/>.
338+
/// </summary>
339+
public static implicit operator EnumValue<TEnum>(TEnum value) => new(value);
340+
341+
/// <summary>
342+
/// Implicitly converts a <see cref="string"/> to an <see cref="EnumValue{TEnum}"/>.
333343
/// </summary>
334344
public static implicit operator EnumValue<TEnum>(StringSegment value) => new(value);
335345

336346
/// <summary>
337-
/// Implicitly converts an string to an EnumValue of enum type TEnum.
347+
/// Implicitly converts a <see cref="string"/> to an <see cref="EnumValue{TEnum}"/>.
338348
/// </summary>
339349
public static implicit operator EnumValue<TEnum>(string value) => new(value);
340350

@@ -385,21 +395,15 @@ public readonly struct EnumValueCaseIgnored<TEnum>
385395
where TEnum : Enum
386396
{
387397
/// <summary>
388-
/// Constructs an EnumValueCaseIgnored&lt;<typeparamref name="TEnum"/>&gt; using the provided enum value.
398+
/// Constructs an <see cref="EnumValueCaseIgnored{TEnum}"/> using the provided enum value.
389399
/// </summary>
390-
public EnumValueCaseIgnored(TEnum value)
391-
{
392-
Value = value;
393-
}
400+
public EnumValueCaseIgnored(TEnum value) => Value = value;
394401

395402
/// <summary>
396-
/// Parses the string value to construct an EnumValueCaseIgnored&lt;<typeparamref name="TEnum"/>&gt; instance.
403+
/// Parses the string value to construct an <see cref="EnumValueCaseIgnored{TEnum}"/> instance.
397404
/// </summary>
398405
/// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
399-
public EnumValueCaseIgnored(StringSegment value)
400-
{
401-
Value = EnumValue.Parse<TEnum>(value, true);
402-
}
406+
public EnumValueCaseIgnored(StringSegment value) => Value = EnumValue.Parse<TEnum>(value, true);
403407

404408
/// <inheritdoc cref="EnumValue{TEnum}.Value"/>
405409
public readonly TEnum Value { get; }
@@ -411,12 +415,12 @@ public EnumValueCaseIgnored(StringSegment value)
411415
public bool Equals(EnumValue<TEnum> other) => Value.Equals(other.Value);
412416

413417
/// <summary>
414-
/// Compares an EnumValueCaseIgnored and EnumValue for enum equality.
418+
/// Compares an <see cref="EnumValueCaseIgnored{TEnum}"/> and <see cref="EnumValue{TEnum}"/> for <typeparamref name="TEnum"/> equality.
415419
/// </summary>
416420
public static bool operator ==(EnumValueCaseIgnored<TEnum> left, EnumValue<TEnum> right) => left.Value.Equals(right.Value);
417421

418422
/// <summary>
419-
/// Compares an EnumValueCaseIgnored and EnumValue for enum inequality.
423+
/// Compares an <see cref="EnumValueCaseIgnored{TEnum}"/> and <see cref="EnumValue{TEnum}"/> for <typeparamref name="TEnum"/> inequality.
420424
/// </summary>
421425
public static bool operator !=(EnumValueCaseIgnored<TEnum> left, EnumValue<TEnum> right)
422426
=> !left.Value.Equals(right.Value);
@@ -426,13 +430,13 @@ public bool Equals(EnumValueCaseIgnored<TEnum> other)
426430
=> Value.Equals(other.Value);
427431

428432
/// <summary>
429-
/// Compares two EnumValueCaseIgnored for enum equality.
433+
/// Compares two <see cref="EnumValueCaseIgnored{TEnum}"/> for <typeparamref name="TEnum"/> equality.
430434
/// </summary>
431435
public static bool operator ==(EnumValueCaseIgnored<TEnum> left, EnumValueCaseIgnored<TEnum> right)
432436
=> left.Value.Equals(right.Value);
433437

434438
/// <summary>
435-
/// Compares two EnumValueCaseIgnored for enum inequality.
439+
/// Compares two <see cref="EnumValueCaseIgnored{TEnum}"/> for <typeparamref name="TEnum"/> inequality.
436440
/// </summary>
437441
public static bool operator !=(EnumValueCaseIgnored<TEnum> left, EnumValueCaseIgnored<TEnum> right)
438442
=> !left.Value.Equals(right.Value);
@@ -442,13 +446,13 @@ public bool Equals(TEnum other)
442446
=> Value.Equals(other);
443447

444448
/// <summary>
445-
/// Compares an EnumValueCaseIgnored and an enum value for enum equality.
449+
/// Compares an <see cref="EnumValueCaseIgnored{TEnum}"/> and a <typeparamref name="TEnum"/> value for equality.
446450
/// </summary>
447451
public static bool operator ==(EnumValueCaseIgnored<TEnum> left, TEnum right)
448452
=> left.Value.Equals(right);
449453

450454
/// <summary>
451-
/// Compares an EnumValueCaseIgnored and an enum value for enum inequality.
455+
/// Compares an <see cref="EnumValueCaseIgnored{TEnum}"/> and a <typeparamref name="TEnum"/> value for inequality.
452456
/// </summary>
453457
public static bool operator !=(EnumValueCaseIgnored<TEnum> left, TEnum right)
454458
=> !left.Value.Equals(right);
@@ -464,34 +468,40 @@ public override int GetHashCode()
464468
=> Value.GetHashCode();
465469

466470
/// <summary>
467-
/// Implicitly converts an EnumValue to an EnumValueCaseInsensitive.
471+
/// Implicitly converts an <see cref="EnumValue{TEnum}"/> to an <see cref="EnumValueCaseIgnored{TEnum}"/>.
468472
/// Before conversion they are already equivalent.
469473
/// </summary>
470474
public static implicit operator EnumValueCaseIgnored<TEnum>(EnumValue<TEnum> value)
471475
=> new(value.Value);
472476

473477
/// <summary>
474-
/// Implicitly returns the actual enum contained by the EnumValueCaseIgnored.
478+
/// Implicitly returns the actual <typeparamref name="TEnum"/> contained by the <see cref="EnumValueCaseIgnored{TEnum}"/>.
475479
/// </summary>
476480
public static implicit operator TEnum(EnumValueCaseIgnored<TEnum> value)
477481
=> value.Value;
478482

479483
/// <summary>
480-
/// Implicitly converts an string to an EnumValueCaseIgnored of enum type TEnum.
484+
/// Implicitly converts an <typeparamref name="TEnum"/> to an <see cref="EnumValue{TEnum}"/>.
485+
/// </summary>
486+
public static implicit operator EnumValueCaseIgnored<TEnum>(TEnum value)
487+
=> new(value);
488+
489+
/// <summary>
490+
/// Implicitly converts a <see cref="string"/> to an <see cref="EnumValueCaseIgnored{TEnum}"/>.
481491
/// </summary>
482492
public static implicit operator EnumValueCaseIgnored<TEnum>(StringSegment value)
483493
=> new(value);
484494

485495
/// <summary>
486-
/// Implicitly converts an string to an EnumValueCaseIgnored of enum type TEnum.
496+
/// Implicitly converts a <see cref="string"/> to an <see cref="EnumValueCaseIgnored{TEnum}"/>.
487497
/// </summary>
488498
public static implicit operator EnumValueCaseIgnored<TEnum>(string value)
489499
=> new(value);
490500

491501
private string GetDebuggerDisplay()
492502
{
493503
var eType = typeof(TEnum);
494-
return $"{eType.Name}.{Value} [EnumValueCaseIgnored<{eType.FullName}>]";
504+
return $"{eType.Name}.{ToString()} [EnumValueCaseIgnored<{eType.FullName}>]";
495505
}
496506
}
497507

Source/Open.Text.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<RepositoryUrl>https://github.com/Open-NET-Libraries/Open.Text</RepositoryUrl>
2020
<RepositoryType>git</RepositoryType>
2121
<PackageTags>string, span, enum, readonlyspan, text, format, split, trim, equals, trimmed equals, first, last, preceding, following, stringbuilder, extensions, stringcomparable, spancomparable, stringsegment, splitassegment</PackageTags>
22-
<Version>6.6.4</Version>
22+
<Version>6.7.0</Version>
2323
<PackageReleaseNotes></PackageReleaseNotes>
2424
<PackageLicenseExpression>MIT</PackageLicenseExpression>
2525
<PublishRepositoryUrl>true</PublishRepositoryUrl>

0 commit comments

Comments
 (0)