register(EmailCaster::class, $emailCaster); $hashCaster = new HashCaster(); $registry->register(HashCaster::class, $hashCaster); echo "1. Creating TypedPlaceholder for EmailAddress:\n"; try { $emailPlaceholder = TypedPlaceholder::for( EmailAddress::class, $registry, 'userEmail' ); echo " ✅ Created typed placeholder: {$emailPlaceholder->toString()}\n"; echo " 📧 Pattern: {$emailPlaceholder->getPattern()}\n"; // Test conversion $testEmail = 'user@example.com'; $convertedEmail = $emailPlaceholder->convertValue($testEmail); echo " 🔄 Converted '{$testEmail}' to: " . get_class($convertedEmail) . "\n"; echo " 📋 Value: {$convertedEmail->value}\n\n"; } catch (\Throwable $e) { echo " ❌ Error: {$e->getMessage()}\n\n"; } echo "2. Creating TypedPlaceholder for Hash:\n"; try { $hashPlaceholder = TypedPlaceholder::for( Hash::class, $registry, 'fileHash' ); echo " ✅ Created typed placeholder: {$hashPlaceholder->toString()}\n"; echo " 🔐 Pattern: {$hashPlaceholder->getPattern()}\n"; // Test conversion with proper SHA256 hash (64 characters) $testHash = 'a1b2c3d4e5f67890123456789012345678901234567890123456789012345678'; $convertedHash = $hashPlaceholder->convertValue($testHash); echo " 🔄 Converted hash to: " . get_class($convertedHash) . "\n"; echo " 📋 Value: {$convertedHash->toString()}\n\n"; } catch (\Throwable $e) { echo " ❌ Error: {$e->getMessage()}\n\n"; } echo "3. Creating RoutePath with TypedPlaceholders:\n"; try { $routePath = RoutePath::fromElements( 'api', 'users', TypedPlaceholder::for(EmailAddress::class, $registry, 'email'), 'files', TypedPlaceholder::for(Hash::class, $registry, 'hash') ); echo " ✅ Created route: {$routePath->toString()}\n"; echo " 🎯 Is dynamic: " . ($routePath->isDynamic() ? 'Yes' : 'No') . "\n"; echo " 📝 Parameters: " . implode(', ', $routePath->getParameterNames()) . "\n\n"; } catch (\Throwable $e) { echo " ❌ Error: {$e->getMessage()}\n\n"; } echo "4. Testing unsupported type (should fail gracefully):\n"; try { $unsupportedPlaceholder = TypedPlaceholder::for( 'NonExistentClass', $registry ); echo " ❌ This should not succeed!\n"; } catch (\Throwable $e) { echo " ✅ Expected error: {$e->getMessage()}\n\n"; } echo "=== Typed Route Parameters Test Completed ===\n";