https://github.com/ktsu-dev/semantics
https://github.com/ktsu-dev/semantics
Last synced: 3 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/ktsu-dev/semantics
- Owner: ktsu-dev
- License: mit
- Created: 2025-06-07T10:47:05.000Z (12 months ago)
- Default Branch: main
- Last Pushed: 2026-01-24T23:11:03.000Z (4 months ago)
- Last Synced: 2026-01-25T12:09:18.351Z (4 months ago)
- Language: C#
- Size: 1.99 MB
- Stars: 0
- Watchers: 0
- Forks: 2
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.md
- Authors: AUTHORS.md
- Copyright: COPYRIGHT.md
Awesome Lists containing this project
README
# ktsu.Semantics
[](https://www.nuget.org/packages/ktsu.Semantics/)
[](https://www.nuget.org/packages/ktsu.Semantics/)
[](https://github.com/ktsu-dev/Semantics/actions)
A comprehensive .NET library for creating type-safe, validated types with semantic meaning. Transform primitive string and numeric obsession into strongly-typed, self-validating domain models with comprehensive validation, specialized path handling, and a complete physics quantities system covering 80+ quantities across 8 major scientific domains with dimensional analysis and centralized physical constants.
## Overview
The Semantics library enables you to create strongly-typed wrappers that carry semantic meaning and built-in validation. Instead of passing raw primitives around your application, you can create specific types like `EmailAddress`, `FilePath`, `Temperature`, or `UserId` that are impossible to misuse and automatically validate their content.
## 🌟 Key Features
- **Type Safety**: Eliminate primitive obsession with strongly-typed wrappers
- **Comprehensive Validation**: 50+ built-in validation attributes for all common scenarios
- **Path Handling**: Specialized path types with polymorphic interfaces and file system operations
- **Complete Physics System**: 80+ physics quantities across 8 scientific domains with dimensional analysis
- **Physical Constants**: Centralized, type-safe access to fundamental and derived constants with validation
- **Bootstrap Architecture**: Clean circular dependency resolution for complex type systems
- **Unit Conversions**: Automatic unit handling with compile-time dimensional safety
- **Factory Pattern**: Clean object creation with dependency injection support
- **Performance Optimized**: Span-based operations, pooled builders, and minimal allocations
- **Enterprise Ready**: Full .NET ecosystem integration (ASP.NET Core, Entity Framework, etc.)
- **Comprehensive Testing**: Derived constants validation and physics relationship verification
## 🚀 Quick Start
### Installation
```bash
dotnet add package ktsu.Semantics
```
### Basic Usage
```csharp
using ktsu.Semantics;
// Define strongly-typed domain models
[IsEmail]
public sealed record EmailAddress : SemanticString { }
[HasLength(8, 50), IsNotEmpty]
public sealed record UserId : SemanticString { }
// Simple direct usage - Clean API with type inference:
// 1. Create methods (recommended) - no generic parameters needed!
var email1 = EmailAddress.Create("user@example.com");
var userId1 = UserId.Create("USER_12345");
// 2. From character arrays
char[] emailChars = ['u', 's', 'e', 'r', '@', 'e', 'x', 'a', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm'];
var email2 = EmailAddress.Create(emailChars);
// 3. From ReadOnlySpan (performance optimized)
var userId2 = UserId.Create("USER_12345".AsSpan());
// 4. Explicit string casting
var email3 = (EmailAddress)"user@example.com";
var userId3 = (UserId)"USER_12345";
// 5. Safe creation with TryCreate (no exceptions)
if (EmailAddress.TryCreate("maybe@invalid", out EmailAddress? safeEmail))
{
// Use safeEmail - validation succeeded
}
// Compile-time safety prevents mistakes
public void SendWelcomeEmail(EmailAddress to, UserId userId) { /* ... */ }
// This won't compile - type safety in action!
// SendWelcomeEmail(userId, email); // ❌ Compiler error!
```
### Factory Pattern Usage
```csharp
// Use factory pattern (recommended for dependency injection)
var emailFactory = new SemanticStringFactory();
var userFactory = new SemanticStringFactory();
// Clean overloaded API - Create methods
var email = emailFactory.Create("user@example.com");
var userId = userFactory.Create("USER_12345");
// All input types supported via overloading
var email2 = emailFactory.Create(['u', 's', 'e', 'r', '@', 'e', 'x', 'a', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm']);
var userId2 = userFactory.Create("USER_12345".AsSpan());
// Safe creation with TryCreate
if (emailFactory.TryCreate("maybe@invalid", out EmailAddress? safeEmail))
{
// Success!
}
// Legacy FromString methods still available
var email3 = emailFactory.FromString("user@example.com");
```
### Physics Quantities System
```csharp
// Complete physics system with 80+ quantities across 8 domains
public sealed record Temperature : PhysicalQuantity, T> where T : struct, INumber { }
public sealed record Force : PhysicalQuantity, T> where T : struct, INumber { }
public sealed record Energy : PhysicalQuantity, T> where T : struct, INumber { }
// Create quantities with dimensional safety
var temp = Temperature.FromCelsius(25.0); // 298.15 K
var force = Force.FromNewtons(100.0); // 100 N
var distance = Length.FromMeters(5.0); // 5 m
// Physics relationships with compile-time safety
var work = force * distance; // Results in Energy
var power = work / Time.FromSeconds(10.0); // Results in Power
// Type-safe unit conversions
Console.WriteLine(temp.ToFahrenheit()); // 77°F
Console.WriteLine(force.ToPounds()); // 22.48 lbf
// Access physical constants with type safety
var gasConstant = PhysicalConstants.Generic.GasConstant(); // 8.314 J/(mol·K)
var speedOfLight = PhysicalConstants.Generic.SpeedOfLight(); // 299,792,458 m/s
var planckConstant = PhysicalConstants.Generic.PlanckConstant(); // Type-safe constant access
// Dimensional analysis prevents errors
// var invalid = force + temp; // ❌ Compiler error!
```
### Path Handling
```csharp
// Use specialized path types
var fileFactory = new SemanticStringFactory();
var configFile = fileFactory.Create(@"C:\app\config.json");
// Rich path operations
Console.WriteLine(configFile.FileName); // config.json
Console.WriteLine(configFile.FileExtension); // .json
Console.WriteLine(configFile.DirectoryPath); // C:\app
Console.WriteLine(configFile.Exists); // True/False
// Polymorphic path collections
List allPaths = [
AbsoluteFilePath.FromString(@"C:\data.txt"),
RelativeDirectoryPath.FromString(@"logs\app"),
FilePath.FromString(@"document.pdf")
];
// Filter by interface type
var filePaths = allPaths.OfType().ToList();
var absolutePaths = allPaths.OfType().ToList();
```
### Complex Validation
```csharp
// Combine multiple validation rules
[IsNotEmpty, IsEmail, HasLength(5, 100)]
public sealed record BusinessEmail : SemanticString { }
// Use validation strategies for flexible requirements
[ValidateAny] // Either email OR phone is acceptable
[IsEmail, RegexMatch(@"^\+?\d{10,15}$")]
public sealed record ContactInfo : SemanticString { }
// First-class type validation
[IsDateTime]
public sealed record ScheduledDate : SemanticString { }
[IsDecimal, IsPositive]
public sealed record Price : SemanticString { }
[IsGuid]
public sealed record TransactionId : SemanticString { }
```
## 🔧 Common Use Cases
### E-commerce Domain
```csharp
[HasLength(3, 20), IsNotEmpty]
public sealed record ProductSku : SemanticString { }
[IsPositive, IsDecimal]
public sealed record Price : SemanticString { }
[IsEmail]
public sealed record CustomerEmail : SemanticString { }
public class Order
{
public CustomerEmail CustomerEmail { get; set; }
public ProductSku[] Items { get; set; }
public Price TotalAmount { get; set; }
}
```
### Configuration Management
```csharp
[IsAbsolutePath, DoesExist]
public sealed record ConfigFilePath : SemanticString { }
[IsIpAddress]
public sealed record ServerAddress : SemanticString { }
[IsInRange(1, 65535)]
public sealed record Port : SemanticQuantity { }
```
### Physical Constants System
All physical constants are centralized in `PhysicalConstants` with type-safe generic access:
```csharp
// Fundamental constants (SI 2019 definitions)
var c = PhysicalConstants.Generic.SpeedOfLight(); // 299,792,458 m/s
var h = PhysicalConstants.Generic.PlanckConstant(); // 6.62607015×10⁻³⁴ J⋅s
var k = PhysicalConstants.Generic.BoltzmannConstant(); // 1.380649×10⁻²³ J/K
var NA = PhysicalConstants.Generic.AvogadroNumber(); // 6.02214076×10²³ /mol
// Temperature constants
var T0 = PhysicalConstants.Generic.StandardTemperature(); // 273.15 K
var P0 = PhysicalConstants.Generic.StandardAtmosphericPressure(); // 101,325 Pa
// Conversion factors with derived validation
var ftToM = PhysicalConstants.Generic.FeetToMeters(); // 0.3048 m/ft
var sqFtToSqM = PhysicalConstants.Generic.SquareFeetToSquareMeters(); // Derived: ftToM²
// All constants have comprehensive test coverage ensuring derived values match calculations
```
### Complete Physics Domains
The library includes **80+ physics quantities** across **8 scientific domains**:
#### 🔧 Mechanics (15 quantities)
```csharp
// Kinematics and dynamics
var velocity = Velocity.FromMetersPerSecond(15.0);
var acceleration = Acceleration.FromMetersPerSecondSquared(9.8);
var force = Mass.FromKilograms(10.0) * acceleration; // F = ma
// Work and energy
var work = force * Length.FromMeters(5.0); // W = F⋅d
var power = work / Time.FromSeconds(2.0); // P = W/t
```
#### ⚡ Electrical (11 quantities)
```csharp
// Ohm's law relationships
var voltage = Voltage.FromVolts(12.0);
var current = Current.FromAmperes(2.0);
var resistance = voltage / current; // R = V/I
var power = voltage * current; // P = VI
```
#### 🌡️ Thermal (10 quantities)
```csharp
// Thermodynamics
var temp = Temperature.FromCelsius(25.0);
var heat = Heat.FromJoules(1000.0);
var capacity = HeatCapacity.FromJoulesPerKelvin(100.0);
var entropy = heat / temp; // S = Q/T
```
#### 🧪 Chemical (10 quantities)
```csharp
// Chemical calculations
var moles = AmountOfSubstance.FromMoles(0.5);
var molarity = moles / Volume.FromLiters(2.0); // M = n/V
var rate = ReactionRate.FromMolarPerSecond(0.01);
```
#### 🔊 Acoustic (20 quantities)
```csharp
// Sound and vibration
var frequency = Frequency.FromHertz(440.0); // A4 note
var wavelength = SoundSpeed.Default / frequency; // λ = v/f
var intensity = SoundIntensity.FromWattsPerSquareMeter(1e-6);
```
#### ☢️ Nuclear (5 quantities)
```csharp
// Nuclear physics
var activity = RadioactiveActivity.FromBecquerels(1000.0);
var dose = AbsorbedDose.FromGrays(0.001);
var exposure = Exposure.FromCoulombsPerKilogram(1e-6);
```
#### 💡 Optical (6 quantities)
```csharp
// Photometry and optics
var flux = LuminousFlux.FromLumens(800.0);
var illuminance = flux / Area.FromSquareMeters(4.0); // E = Φ/A
var luminance = Luminance.FromCandelasPerSquareMeter(100.0);
```
#### 🌊 Fluid Dynamics (5 quantities)
```csharp
// Fluid mechanics
var viscosity = DynamicViscosity.FromPascalSeconds(0.001);
var flowRate = VolumetricFlowRate.FromCubicMetersPerSecond(0.1);
var reynolds = ReynoldsNumber.Calculate(velocity, Length.FromMeters(0.1), viscosity);
```
## 🏛️ Architecture & Design
### Bootstrap Architecture
The library uses a sophisticated bootstrap architecture to resolve circular dependencies:
```csharp
// BootstrapUnits class provides initial unit definitions during system initialization
// PhysicalDimensions uses BootstrapUnits to define dimensions without circular dependencies
// Units class replaces bootstrap units with full unit definitions after initialization
// This clean separation enables complex type systems while maintaining performance
```
### Derived Constants Validation
All derived physical constants are validated against their fundamental relationships:
```csharp
// Example: Area conversions are validated to ensure SquareFeetToSquareMeters = FeetToMeters²
[TestMethod]
public void DerivedConstants_AreaConversions_MatchCalculatedValues()
{
var feetToMeters = PhysicalConstants.Conversion.FeetToMeters;
var calculatedSquareFeet = feetToMeters * feetToMeters;
var storedSquareFeet = PhysicalConstants.Conversion.SquareFeetToSquareMeters;
Assert.AreEqual(calculatedSquareFeet, storedSquareFeet, tolerance);
}
// Comprehensive test coverage ensures physical relationships are mathematically correct
```
## 🏗️ Dependency Injection
```csharp
// Register factories in your DI container
services.AddTransient, SemanticStringFactory>();
// Use in services
public class UserService
{
private readonly ISemanticStringFactory _emailFactory;
public UserService(ISemanticStringFactory emailFactory)
{
_emailFactory = emailFactory;
}
public async Task CreateUserAsync(string email)
{
// Factory handles validation and throws meaningful exceptions
var validatedEmail = _emailFactory.Create(email);
return new User(validatedEmail);
}
}
```
## 📖 Documentation
Comprehensive documentation is available in the [`docs/`](docs/) directory:
- **[Complete Library Guide](docs/complete-library-guide.md)** - 🌟 **START HERE** - Complete overview of all library features and components
- **[Architecture Guide](docs/architecture.md)** - SOLID principles, design patterns, and system architecture
- **[Advanced Usage Guide](docs/advanced-usage.md)** - Advanced features, custom validation, and best practices
- **[Validation Reference](docs/validation-reference.md)** - Complete reference of all validation attributes
- **[FluentValidation Integration](docs/fluent-validation-integration.md)** - Integration with FluentValidation library
## 💡 Examples
Extensive examples are available in [`docs/examples/`](docs/examples/):
- **[Getting Started](docs/examples/getting-started.md)** - Basic usage patterns
- **[Physics Relationships](docs/examples/PhysicsRelationshipExamples.md)** - Physics calculations and relationships
- **[Validation Attributes](docs/examples/validation-attributes.md)** - Built-in and custom validation
- **[Path Handling](docs/examples/path-handling.md)** - File system operations
- **[Factory Pattern](docs/examples/factory-pattern.md)** - Object creation and DI
- **[String Operations](docs/examples/string-operations.md)** - String compatibility and LINQ
- **[Type Conversions](docs/examples/type-conversions.md)** - Cross-type conversions
- **[Real-World Scenarios](docs/examples/real-world-scenarios.md)** - Complete domain examples
## 🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
## 📄 License
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details.
## 🆘 Support
- 📖 [Documentation](https://github.com/ktsu-dev/Semantics/wiki)
- 🐛 [Issues](https://github.com/ktsu-dev/Semantics/issues)
- 💬 [Discussions](https://github.com/ktsu-dev/Semantics/discussions)
- 📦 [NuGet Package](https://www.nuget.org/packages/ktsu.Semantics/)
---
*Transform your primitive-obsessed code into a strongly-typed, self-validating domain model with ktsu.Semantics.*