Skip to content

Commit 28be99b

Browse files
committed
Removed "validatable" smart enums
1 parent 2758f86 commit 28be99b

File tree

318 files changed

+2053
-7116
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

318 files changed

+2053
-7116
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ See [wiki](https://github.com/PawelGerr/Thinktecture.Runtime.Extensions/wiki) fo
3434

3535
# Migrations
3636

37+
* [Migration from v8 to v9](https://github.com/PawelGerr/Thinktecture.Runtime.Extensions/wiki/Migration-from-v8-to-v9)
3738
* [Migration from v7 to v8](https://github.com/PawelGerr/Thinktecture.Runtime.Extensions/wiki/Migration-from-v7-to-v8)
3839
* [Migration from v6 to v7](https://github.com/PawelGerr/Thinktecture.Runtime.Extensions/wiki/Migration-from-v6-to-v7)
3940

docs

Submodule docs updated from 7149172 to 6b43f4a

samples/AspNetCore.Samples/AspNetCore.Samples_demo.json

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"content": {
2727
"application/json": {
2828
"schema": {
29-
"$ref": "#/components/schemas/ProductCategoryBoolean<>f__AnonymousType0"
29+
"$ref": "#/components/schemas/ProductCategory"
3030
}
3131
}
3232
}
@@ -55,7 +55,7 @@
5555
"content": {
5656
"application/json": {
5757
"schema": {
58-
"$ref": "#/components/schemas/ProductGroupBoolean<>f__AnonymousType0"
58+
"$ref": "#/components/schemas/ProductGroup"
5959
}
6060
}
6161
}
@@ -575,18 +575,6 @@
575575
"Dairy"
576576
]
577577
},
578-
"ProductCategoryBoolean<>f__AnonymousType0": {
579-
"type": "object",
580-
"properties": {
581-
"value": {
582-
"$ref": "#/components/schemas/ProductCategory"
583-
},
584-
"isValid": {
585-
"type": "boolean"
586-
}
587-
},
588-
"additionalProperties": false
589-
},
590578
"ProductGroup": {
591579
"enum": [
592580
1,
@@ -599,18 +587,6 @@
599587
"Orange"
600588
]
601589
},
602-
"ProductGroupBoolean<>f__AnonymousType0": {
603-
"type": "object",
604-
"properties": {
605-
"value": {
606-
"$ref": "#/components/schemas/ProductGroup"
607-
},
608-
"isValid": {
609-
"type": "boolean"
610-
}
611-
},
612-
"additionalProperties": false
613-
},
614590
"ProductName": {
615591
"type": "string"
616592
},

samples/AspNetCore.Samples/Controllers/DemoController.cs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ public DemoController(ILogger<DemoController> logger)
2222
[HttpGet("category/{category}")]
2323
public IActionResult RoundTrip(ProductCategory category)
2424
{
25-
return RoundTripValidatableEnum(category);
25+
return RoundTripInternal(category);
2626
}
2727

2828
[HttpGet("group/{group}")]
2929
public IActionResult RoundTrip(ProductGroup group)
3030
{
31-
return RoundTripValidatableEnum(group);
31+
return RoundTripInternal(group);
3232
}
3333

3434
[HttpGet("productType/{productType}")]
@@ -143,17 +143,6 @@ public IActionResult RoundTrip(TextOrNumberSerializable textOrNumber)
143143
return Json(textOrNumber);
144144
}
145145

146-
private IActionResult RoundTripValidatableEnum<T>(T value)
147-
where T : IValidatableEnum
148-
{
149-
if (!ModelState.IsValid)
150-
return BadRequest(ModelState);
151-
152-
_logger.LogInformation("Round trip test with {Type}: {Value}", value.GetType().Name, value);
153-
154-
return Json(new { Value = value, value.IsValid });
155-
}
156-
157146
private IActionResult RoundTripInternal<T>(T value)
158147
where T : notnull
159148
{

samples/AspNetCore.Samples/Program.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,8 @@ private static Task StartMinimalWebApiAsync(ILoggerFactory loggerFactory)
173173

174174
var routeGroup = app.MapGroup("/api");
175175

176-
routeGroup.MapGet("category/{category}", (ProductCategory category) => new { Value = category, category.IsValid });
177-
routeGroup.MapGet("group/{group}", (ProductGroup group) => new { Value = group, group.IsValid });
176+
routeGroup.MapGet("category/{category}", (ProductCategory category) => category);
177+
routeGroup.MapGet("group/{group}", (ProductGroup group) => group);
178178
routeGroup.MapGet("productType/{productType}", (ProductType productType) => productType);
179179
routeGroup.MapGet("productType", (ProductType productType) => productType);
180180
routeGroup.MapGet("productTypeWithFilter", (BoundValueObject<ProductType, ProductTypeValidationError> productType) => ValueTask.FromResult(productType.Value))

samples/AspNetCore.Samples/Validation/BoundValueObject.cs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,9 @@ public static bool TryParse(string s, IFormatProvider? formatProvider, out Bound
3333
{
3434
var validationError = T.Validate(key, formatProvider, out var item);
3535

36-
if (validationError is null || item is IValidatableEnum)
37-
{
38-
value = new BoundValueObject<T, TKey, TValidationError>(item);
39-
}
40-
else
41-
{
42-
value = new BoundValueObject<T, TKey, TValidationError>(validationError.ToString() ?? "Invalid format");
43-
}
36+
value = validationError is null
37+
? new BoundValueObject<T, TKey, TValidationError>(item)
38+
: new BoundValueObject<T, TKey, TValidationError>(validationError.ToString() ?? "Invalid format");
4439
}
4540

4641
return true;
@@ -70,14 +65,9 @@ public static bool TryParse(string s, IFormatProvider? formatProvider, out Bound
7065
{
7166
var validationError = T.Validate(s, formatProvider, out var item);
7267

73-
if (validationError is null || item is IValidatableEnum)
74-
{
75-
value = new BoundValueObject<T, TValidationError>(item);
76-
}
77-
else
78-
{
79-
value = new BoundValueObject<T, TValidationError>(validationError.ToString() ?? "Invalid format");
80-
}
68+
value = validationError is null
69+
? new BoundValueObject<T, TValidationError>(item)
70+
: new BoundValueObject<T, TValidationError>(validationError.ToString() ?? "Invalid format");
8171

8272
return true;
8373
}

samples/Basic.Samples/SmartEnums/ProductCategory.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
namespace Thinktecture.SmartEnums;
22

3-
[SmartEnum<string>(IsValidatable = true,
4-
KeyMemberName = "Name")]
3+
[SmartEnum<string>(KeyMemberName = "Name")]
54
public partial class ProductCategory
65
{
76
public static readonly ProductCategory Fruits = new("Fruits");

samples/Basic.Samples/SmartEnums/ProductGroup.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
namespace Thinktecture.SmartEnums;
22

3-
[SmartEnum<int>(IsValidatable = true,
4-
ComparisonOperators = OperatorsGeneration.DefaultWithKeyTypeOverloads,
3+
[SmartEnum<int>(ComparisonOperators = OperatorsGeneration.DefaultWithKeyTypeOverloads,
54
SkipToString = true)]
65
public partial class ProductGroup
76
{
@@ -13,20 +12,11 @@ public partial class ProductGroup
1312

1413
public int Do(string foo)
1514
{
16-
EnsureValid(); // "Do()" is not allowed for invalid items
17-
1815
// do something
1916

2017
return 42;
2118
}
2219

23-
private static ProductGroup CreateInvalidItem(int key)
24-
{
25-
// the values can be anything besides the key,
26-
// the key must not be null
27-
return new(key, false, "Unknown product group", ProductCategory.Get("Unknown"));
28-
}
29-
3020
public override string ToString()
3121
{
3222
return DisplayName;

samples/Basic.Samples/SmartEnums/ProductGroupStruct.cs

Lines changed: 0 additions & 11 deletions
This file was deleted.

samples/Basic.Samples/SmartEnums/SmartEnumDemos.cs

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ public static void Demo(ILogger logger)
1313
{
1414
DemoForSmartEnum(logger);
1515
DemoForSmartEnumWithCustomComparer(logger);
16-
DemoForValidatableEnum(logger);
1716

1817
DemoForDailySalesCsvImporterType(logger);
1918
DemoForMonthlySalesCsvImporterType(logger);
@@ -97,7 +96,10 @@ private static void DemoForSmartEnum(ILogger logger)
9796
isBigger = ProductGroup.Apple > 42;
9897
logger.Information("{Apple} > {42} = {IsBigger}", ProductGroup.Apple, 42, isBigger);
9998

100-
logger.Information("==== Demo for abstract static members ====");
99+
logger.Information(@"
100+
101+
==== Demo for abstract static members ====
102+
");
101103

102104
Get<ProductType, string, ProductTypeValidationError>(logger, "Groceries");
103105
}
@@ -173,11 +175,6 @@ private static void SwitchWithAction(ILogger logger)
173175
groceries: static l => l.Information("Switch with Action: Groceries"),
174176
housewares: static l => l.Information("Switch with Action: Housewares"));
175177

176-
// Switch of a "validatable" enum
177-
ProductGroupStruct.Get(42).Switch(invalid: invalidItem => Console.WriteLine($"Invalid item: {invalidItem}"),
178-
apple: () => Console.WriteLine("apple"),
179-
orange: () => Console.WriteLine("orange"));
180-
181178
// SwitchPartially with Action
182179
productType.SwitchPartially(@default: item => logger.Information("SwitchPartially with Action: default ('{Item}')", item),
183180
groceries: () => logger.Information("SwitchPartially with Action: Groceries"));
@@ -188,11 +185,6 @@ private static void SwitchWithAction(ILogger logger)
188185
ProductType.Housewares.SwitchPartially(@default: item => logger.Information("SwitchPartially with Action: default ('{Item}')", item),
189186
groceries: () => logger.Information("SwitchPartially with Action: Groceries"));
190187

191-
// Switch of a "validatable" enum
192-
ProductGroupStruct.Get(42).SwitchPartially(invalid: invalidItem => Console.WriteLine($"SwitchPartially with Action: Invalid item ({invalidItem})"),
193-
apple: () => Console.WriteLine("SwitchPartially with Action: apple"),
194-
orange: () => Console.WriteLine("SwitchPartially with Action: orange"));
195-
196188
// SwitchPartially with Action<TState>
197189
productType.SwitchPartially(logger,
198190
@default: static (l, item) => l.Information("SwitchPartially with Action<TState>: default ('{Item}')", item),
@@ -242,35 +234,6 @@ private static void DemoForSmartEnumWithCustomComparer(ILogger logger)
242234
lowerCased > upperCased);
243235
}
244236

245-
private static void DemoForValidatableEnum(ILogger logger)
246-
{
247-
logger.Information("""
248-
249-
250-
==== Demo for SmartEnum<T>(IsValidatable = true) ====
251-
252-
""");
253-
254-
var categories = ProductCategory.Items;
255-
logger.Information("Categories: {Categories}", categories);
256-
257-
var category = ProductCategory.Get("Fruits");
258-
logger.Information("Category: {Category}", category);
259-
260-
// Throws "InvalidOperationException" if not valid
261-
category.EnsureValid();
262-
263-
if (ProductCategory.TryGet("fruits", out var fruits))
264-
logger.Information("Category {Category} with TryGet found", fruits);
265-
266-
string keyOfTheCategory = category;
267-
logger.Information("Implicit conversion of Category -> string: {Key}", keyOfTheCategory);
268-
269-
var unknownCategory = ProductCategory.Get("Grains");
270-
logger.Information("unknownCategory.Key: {CategoryKey}", unknownCategory.Name);
271-
logger.Information("unknownCategory.isValid: {IsValid}", unknownCategory.IsValid);
272-
}
273-
274237
private static void DemoForDailySalesCsvImporterType(ILogger logger)
275238
{
276239
logger.Information("""
@@ -350,7 +313,7 @@ private static void PrintAllItems<T, TKey, TValidationError>(ILogger logger)
350313

351314
foreach (var item in T.Items)
352315
{
353-
logger.Information("Item: {Item}", item);
316+
logger.Information(" Item: {Item}", item);
354317
}
355318
}
356319

samples/Benchmarking/Benchmarks/LoadingSmartEnums.cs

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,8 @@ private readonly Entity_Enum_IntBased[] _Entity_Enum_IntBased
4242
= Enumerable.Range(1, _NUMBER_OF_ENTITIES).Select(i => new Entity_Enum_IntBased(i, _enums[i % _enums.Length]) { Enum = RealEnum.Value1 }).ToArray();
4343
private readonly Entity_SmartEnum_Class_StringBased[] _Entity_SmartEnum_Class_StringBased
4444
= Enumerable.Range(1, _NUMBER_OF_ENTITIES).Select(i => new Entity_SmartEnum_Class_StringBased(i, TestSmartEnum_Class_StringBased.Items[i % _enums.Length]) { Enum = TestSmartEnum_Class_StringBased.Value1 }).ToArray();
45-
private readonly Entity_SmartEnum_Struct_StringBased[] _Entity_SmartEnum_Struct_StringBased
46-
= Enumerable.Range(1, _NUMBER_OF_ENTITIES).Select(i => new Entity_SmartEnum_Struct_StringBased(i, TestSmartEnum_Struct_StringBased.Items[i % _enums.Length]) { Enum = TestSmartEnum_Struct_StringBased.Value1 }).ToArray();
4745
private readonly Entity_SmartEnum_Class_IntBased[] _Entity_SmartEnum_Class_IntBased
4846
= Enumerable.Range(1, _NUMBER_OF_ENTITIES).Select(i => new Entity_SmartEnum_Class_IntBased(i, TestSmartEnum_Class_IntBased.Items[i % _enums.Length]) { Enum = TestSmartEnum_Class_IntBased.Value1 }).ToArray();
49-
private readonly Entity_SmartEnum_Struct_IntBased[] _Entity_SmartEnum_Struct_IntBased
50-
= Enumerable.Range(1, _NUMBER_OF_ENTITIES).Select(i => new Entity_SmartEnum_Struct_IntBased(i, TestSmartEnum_Struct_IntBased.Items[i % _enums.Length]) { Enum = TestSmartEnum_Struct_IntBased.Value1 }).ToArray();
5147

5248
[GlobalSetup]
5349
public void Initialize()
@@ -68,15 +64,9 @@ public void Initialize()
6864
_dbContext.RemoveRange(_dbContext.Entity_SmartEnum_Class_StringBased);
6965
_dbContext.Entity_SmartEnum_Class_StringBased.AddRange(_Entity_SmartEnum_Class_StringBased);
7066

71-
_dbContext.RemoveRange(_dbContext.Entity_SmartEnum_Struct_StringBased);
72-
_dbContext.Entity_SmartEnum_Struct_StringBased.AddRange(_Entity_SmartEnum_Struct_StringBased);
73-
7467
_dbContext.RemoveRange(_dbContext.Entity_SmartEnum_Class_IntBased);
7568
_dbContext.Entity_SmartEnum_Class_IntBased.AddRange(_Entity_SmartEnum_Class_IntBased);
7669

77-
_dbContext.RemoveRange(_dbContext.Entity_SmartEnum_Struct_IntBased);
78-
_dbContext.Entity_SmartEnum_Struct_IntBased.AddRange(_Entity_SmartEnum_Struct_IntBased);
79-
8070
_dbContext.SaveChanges();
8171
}
8272

@@ -99,12 +89,6 @@ public async Task Real_Enum_StringConverter()
9989
await _dbContext!.Entity_Enum_StringConverter.ToListAsync();
10090
}
10191

102-
[Benchmark]
103-
public async Task SmartEnum_Struct_StringBased()
104-
{
105-
await _dbContext!.Entity_SmartEnum_Struct_StringBased.ToListAsync();
106-
}
107-
10892
[Benchmark]
10993
public async Task SmartEnum_Class_StringBased()
11094
{
@@ -117,12 +101,6 @@ public async Task Real_Enum_IntBased()
117101
await _dbContext!.Entity_Enum_IntBased.ToListAsync();
118102
}
119103

120-
[Benchmark]
121-
public async Task SmartEnum_Struct_IntBased()
122-
{
123-
await _dbContext!.Entity_SmartEnum_Struct_IntBased.ToListAsync();
124-
}
125-
126104
[Benchmark]
127105
public async Task SmartEnum_Class_IntBased()
128106
{

samples/Benchmarking/Database/BenchmarkDbContext.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ public class BenchmarkDbContext : DbContext
88
public DbSet<Entity_Enum_StringConverter> Entity_Enum_StringConverter { get; set; } = null!;
99
public DbSet<Entity_Enum_IntBased> Entity_Enum_IntBased { get; set; } = null!;
1010
public DbSet<Entity_SmartEnum_Class_StringBased> Entity_SmartEnum_Class_StringBased { get; set; } = null!;
11-
public DbSet<Entity_SmartEnum_Struct_StringBased> Entity_SmartEnum_Struct_StringBased { get; set; } = null!;
1211
public DbSet<Entity_SmartEnum_Class_IntBased> Entity_SmartEnum_Class_IntBased { get; set; } = null!;
13-
public DbSet<Entity_SmartEnum_Struct_IntBased> Entity_SmartEnum_Struct_IntBased { get; set; } = null!;
1412

1513
public DbSet<Entity_with_ValueObjects> Entity_with_ValueObjects { get; set; } = null!;
1614
public DbSet<Entity_without_ValueObjects> Entity_without_ValueObjects { get; set; } = null!;
@@ -37,13 +35,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
3735
builder.Property(e => e.Enum).HasMaxLength(20);
3836
});
3937

40-
modelBuilder.Entity<Entity_SmartEnum_Struct_StringBased>(builder =>
41-
{
42-
builder.Property(e => e.Id).ValueGeneratedNever();
43-
builder.Property(e => e.Enum).HasMaxLength(20);
44-
});
4538
modelBuilder.Entity<Entity_SmartEnum_Class_IntBased>(builder => builder.Property(e => e.Id).ValueGeneratedNever());
46-
modelBuilder.Entity<Entity_SmartEnum_Struct_IntBased>(builder => builder.Property(e => e.Id).ValueGeneratedNever());
4739

4840
modelBuilder.Entity<Entity_with_ValueObjects>(builder =>
4941
{

samples/Benchmarking/Database/Entity_SmartEnum_Struct_IntBased.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.

samples/Benchmarking/Database/Entity_SmartEnum_Struct_StringBased.cs

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)