﻿[  
#if NET8_0_OR_GREATER

// ------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a source generator named Vogen (https://github.com/SteveDunn/Vogen)
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
// ------------------------------------------------------------------------------

// Suppress warnings about [Obsolete] member usage in generated code.
#pragma warning disable CS0618

// Suppress warnings for 'Override methods on comparable types'.
#pragma warning disable CA1036

// Suppress Error MA0097 : A class that implements IComparable<T> or IComparable should override comparison operators
#pragma warning disable MA0097

// Suppress warning for 'The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.'
// The generator copies signatures from the BCL, e.g. for `TryParse`, and some of those have nullable annotations.
#pragma warning disable CS8669, CS8632

// Suppress warnings about CS1591: Missing XML comment for publicly visible type or member 'Type_or_Member'
#pragma warning disable CS1591

namespace Foo;
    
  internal static class VogenEfCoreConverters__Ext
  {
      internal static global::Microsoft.EntityFrameworkCore.ModelConfigurationBuilder RegisterAllInVogenEfCoreConverters(this global::Microsoft.EntityFrameworkCore.ModelConfigurationBuilder configurationBuilder)
      {
        configurationBuilder.Properties<Foo.HireDate>().HaveConversion<Foo.VogenEfCoreConverters.HireDateEfCoreValueConverter, Foo.VogenEfCoreConverters.HireDateEfCoreValueComparer>();
configurationBuilder.Properties<Foo.Name>().HaveConversion<Foo.VogenEfCoreConverters.NameEfCoreValueConverter, Foo.VogenEfCoreConverters.NameEfCoreValueComparer>();
configurationBuilder.Properties<Foo.Age>().HaveConversion<Foo.VogenEfCoreConverters.AgeEfCoreValueConverter, Foo.VogenEfCoreConverters.AgeEfCoreValueComparer>();


        return configurationBuilder; 
      }
  }

#endif
  
#if NET8_0_OR_GREATER

// ------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a source generator named Vogen (https://github.com/SteveDunn/Vogen)
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
// ------------------------------------------------------------------------------

// Suppress warnings about [Obsolete] member usage in generated code.
#pragma warning disable CS0618

// Suppress warnings for 'Override methods on comparable types'.
#pragma warning disable CA1036

// Suppress Error MA0097 : A class that implements IComparable<T> or IComparable should override comparison operators
#pragma warning disable MA0097

// Suppress warning for 'The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.'
// The generator copies signatures from the BCL, e.g. for `TryParse`, and some of those have nullable annotations.
#pragma warning disable CS8669, CS8632

// Suppress warnings about CS1591: Missing XML comment for publicly visible type or member 'Type_or_Member'
#pragma warning disable CS1591

namespace Foo;
    
internal partial class VogenEfCoreConverters
{
            public class HireDateEfCoreValueConverter : global::Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter<Foo.HireDate, System.DateTime>
        {
          public HireDateEfCoreValueConverter() : this(null) { }
          public HireDateEfCoreValueConverter(global::Microsoft.EntityFrameworkCore.Storage.ValueConversion.ConverterMappingHints mappingHints = null)
              : base(
                  vo => vo.Value,
                                                                      value => Deserialize(value),
                mappingHints
              ) { }

      static Foo.HireDate Deserialize(System.DateTime value) => UnsafeDeserialize(default, value);
 
      [global::System.Runtime.CompilerServices.UnsafeAccessor(global::System.Runtime.CompilerServices.UnsafeAccessorKind.StaticMethod, Name = "__Deserialize")]
      static extern Foo.HireDate UnsafeDeserialize(Foo.HireDate @this, System.DateTime value);      
        }
        public class HireDateEfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<Foo.HireDate>
        {
            public HireDateEfCoreValueComparer() : base(
                (left, right) => DoCompare(left, right), 
                instance => instance.IsInitialized() ? instance.GetHashCode() : 0) 
            { 
            }
            
            static bool DoCompare(Foo.HireDate left, Foo.HireDate right)
            {
                // if neither are initialized, then they're equal
                if(!left.IsInitialized() && !right.IsInitialized()) return true;
                
                return left.IsInitialized() && right.IsInitialized() && UnderlyingValue(left).Equals(UnderlyingValue(right));
            }
 private static System.DateTime UnderlyingValue(Foo.HireDate i) => UnsafeValueField(ref i);

  [global::System.Runtime.CompilerServices.UnsafeAccessor(global::System.Runtime.CompilerServices.UnsafeAccessorKind.Field, Name = "_value")]
  static extern ref System.DateTime UnsafeValueField(ref Foo.HireDate @this);                
        }
}

public static class HireDate__Ext 
{
        public static global::Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder<Foo.HireDate> HasVogenConversion(this global::Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder<Foo.HireDate> propertyBuilder) =>
            propertyBuilder.HasConversion<Foo.VogenEfCoreConverters.HireDateEfCoreValueConverter, Foo.VogenEfCoreConverters.HireDateEfCoreValueComparer>();
}


#endif
  
#if NET8_0_OR_GREATER

// ------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a source generator named Vogen (https://github.com/SteveDunn/Vogen)
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
// ------------------------------------------------------------------------------

// Suppress warnings about [Obsolete] member usage in generated code.
#pragma warning disable CS0618

// Suppress warnings for 'Override methods on comparable types'.
#pragma warning disable CA1036

// Suppress Error MA0097 : A class that implements IComparable<T> or IComparable should override comparison operators
#pragma warning disable MA0097

// Suppress warning for 'The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.'
// The generator copies signatures from the BCL, e.g. for `TryParse`, and some of those have nullable annotations.
#pragma warning disable CS8669, CS8632

// Suppress warnings about CS1591: Missing XML comment for publicly visible type or member 'Type_or_Member'
#pragma warning disable CS1591

namespace Foo;
    
internal partial class VogenEfCoreConverters
{
            public class NameEfCoreValueConverter : global::Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter<Foo.Name, System.String>
        {
          public NameEfCoreValueConverter() : this(null) { }
          public NameEfCoreValueConverter(global::Microsoft.EntityFrameworkCore.Storage.ValueConversion.ConverterMappingHints mappingHints = null)
              : base(
                  vo => vo.Value,
                                                                      value => Deserialize(value),
                mappingHints
              ) { }

      static Foo.Name Deserialize(System.String value) => UnsafeDeserialize(default, value);
 
      [global::System.Runtime.CompilerServices.UnsafeAccessor(global::System.Runtime.CompilerServices.UnsafeAccessorKind.StaticMethod, Name = "__Deserialize")]
      static extern Foo.Name UnsafeDeserialize(Foo.Name @this, System.String value);      
        }
        public class NameEfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<Foo.Name>
        {
            public NameEfCoreValueComparer() : base(
                (left, right) => DoCompare(left, right), 
                instance => instance.IsInitialized() ? instance.GetHashCode() : 0) 
            { 
            }
            
            static bool DoCompare(Foo.Name left, Foo.Name right)
            {
                // if neither are initialized, then they're equal
                if(!left.IsInitialized() && !right.IsInitialized()) return true;
                
                return left.IsInitialized() && right.IsInitialized() && UnderlyingValue(left).Equals(UnderlyingValue(right));
            }
 private static System.String UnderlyingValue(Foo.Name i) => UnsafeValueField(ref i);

  [global::System.Runtime.CompilerServices.UnsafeAccessor(global::System.Runtime.CompilerServices.UnsafeAccessorKind.Field, Name = "_value")]
  static extern ref System.String UnsafeValueField(ref Foo.Name @this);                
        }
}

public static class Name__Ext 
{
        public static global::Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder<Foo.Name> HasVogenConversion(this global::Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder<Foo.Name> propertyBuilder) =>
            propertyBuilder.HasConversion<Foo.VogenEfCoreConverters.NameEfCoreValueConverter, Foo.VogenEfCoreConverters.NameEfCoreValueComparer>();
}


#endif
  
#if NET8_0_OR_GREATER

// ------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a source generator named Vogen (https://github.com/SteveDunn/Vogen)
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
// ------------------------------------------------------------------------------

// Suppress warnings about [Obsolete] member usage in generated code.
#pragma warning disable CS0618

// Suppress warnings for 'Override methods on comparable types'.
#pragma warning disable CA1036

// Suppress Error MA0097 : A class that implements IComparable<T> or IComparable should override comparison operators
#pragma warning disable MA0097

// Suppress warning for 'The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.'
// The generator copies signatures from the BCL, e.g. for `TryParse`, and some of those have nullable annotations.
#pragma warning disable CS8669, CS8632

// Suppress warnings about CS1591: Missing XML comment for publicly visible type or member 'Type_or_Member'
#pragma warning disable CS1591

namespace Foo;
    
internal partial class VogenEfCoreConverters
{
            public class AgeEfCoreValueConverter : global::Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter<Foo.Age, System.Int32>
        {
          public AgeEfCoreValueConverter() : this(null) { }
          public AgeEfCoreValueConverter(global::Microsoft.EntityFrameworkCore.Storage.ValueConversion.ConverterMappingHints mappingHints = null)
              : base(
                  vo => vo.Value,
                                                                      value => Deserialize(value),
                mappingHints
              ) { }

      static Foo.Age Deserialize(System.Int32 value) => UnsafeDeserialize(default, value);
 
      [global::System.Runtime.CompilerServices.UnsafeAccessor(global::System.Runtime.CompilerServices.UnsafeAccessorKind.StaticMethod, Name = "__Deserialize")]
      static extern Foo.Age UnsafeDeserialize(Foo.Age @this, System.Int32 value);      
        }
        public class AgeEfCoreValueComparer : global::Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer<Foo.Age>
        {
            public AgeEfCoreValueComparer() : base(
                (left, right) => DoCompare(left, right), 
                instance => instance.IsInitialized() ? instance.GetHashCode() : 0) 
            { 
            }
            
            static bool DoCompare(Foo.Age left, Foo.Age right)
            {
                // if neither are initialized, then they're equal
                if(!left.IsInitialized() && !right.IsInitialized()) return true;
                
                return left.IsInitialized() && right.IsInitialized() && UnderlyingValue(left).Equals(UnderlyingValue(right));
            }
 private static System.Int32 UnderlyingValue(Foo.Age i) => UnsafeValueField(ref i);

  [global::System.Runtime.CompilerServices.UnsafeAccessor(global::System.Runtime.CompilerServices.UnsafeAccessorKind.Field, Name = "_value")]
  static extern ref System.Int32 UnsafeValueField(ref Foo.Age @this);                
        }
}

public static class Age__Ext 
{
        public static global::Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder<Foo.Age> HasVogenConversion(this global::Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder<Foo.Age> propertyBuilder) =>
            propertyBuilder.HasConversion<Foo.VogenEfCoreConverters.AgeEfCoreValueConverter, Foo.VogenEfCoreConverters.AgeEfCoreValueComparer>();
}


#endif
  
// ------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a source generator named Vogen (https://github.com/SteveDunn/Vogen)
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
// ------------------------------------------------------------------------------
// Suppress warnings about [Obsolete] member usage in generated code.
#pragma warning disable CS0618
// Suppress warnings for 'Override methods on comparable types'.
#pragma warning disable CA1036
// Suppress Error MA0097 : A class that implements IComparable<T> or IComparable should override comparison operators
#pragma warning disable MA0097
// Suppress warning for 'The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.'
// The generator copies signatures from the BCL, e.g. for `TryParse`, and some of those have nullable annotations.
#pragma warning disable CS8669, CS8632
// Suppress warnings about CS1591: Missing XML comment for publicly visible type or member 'Type_or_Member'
#pragma warning disable CS1591
namespace Foo
{
    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Vogen", "1.0.0.0")]
    [global::System.Text.Json.Serialization.JsonConverter(typeof(HireDateSystemTextJsonConverter))]
    [global::System.ComponentModel.TypeConverter(typeof(HireDateTypeConverter))]
    [global::System.Diagnostics.DebuggerTypeProxyAttribute(typeof(HireDateDebugView))]
    [global::System.Diagnostics.DebuggerDisplayAttribute("Underlying type: System.DateTime, Value = { _value }")]
    // ReSharper disable once UnusedType.Global
    public partial struct HireDate : global::System.IEquatable<HireDate>, global::System.IEquatable<System.DateTime>, global::System.IComparable<HireDate>, global::System.IComparable, global::System.IParsable<HireDate>, global::System.ISpanParsable<HireDate>, global::System.IFormattable, global::System.ISpanFormattable, global::System.IUtf8SpanFormattable
    {
#if DEBUG
private readonly global::System.Diagnostics.StackTrace _stackTrace = null!;
#endif
#if !VOGEN_NO_VALIDATION
        private readonly global::System.Boolean _isInitialized;
#endif
        private readonly System.DateTime _value;
        /// <summary>
        /// Gets the underlying <see cref = "System.DateTime"/> value if set, otherwise a <see cref = "Vogen.ValueObjectValidationException"/> is thrown.
        /// </summary>
        public readonly System.DateTime Value
        {
            [global::System.Diagnostics.DebuggerStepThroughAttribute]
            [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
            get
            {
                EnsureInitialized();
                return _value;
            }
        }

        [global::System.Diagnostics.DebuggerStepThroughAttribute]
        [global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
        public HireDate()
        {
#if DEBUG
            _stackTrace = new global::System.Diagnostics.StackTrace();
#endif
#if !VOGEN_NO_VALIDATION
            _isInitialized = false;
#endif
            _value = default;
        }

        [global::System.Diagnostics.DebuggerStepThroughAttribute]
        private HireDate(System.DateTime value)
        {
            _value = value;
#if !VOGEN_NO_VALIDATION
            _isInitialized = true;
#endif
        }

        /// <summary>
        /// Builds an instance from the provided underlying type.
        /// </summary>
        /// <param name = "value">The underlying type.</param>
        /// <returns>An instance of this type.</returns>
        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
        public static HireDate From(System.DateTime value)
        {
            return new HireDate(value);
        }

        /// <summary>
        /// Tries to build an instance from the provided underlying type.
        /// If a normalization method is provided, it will be called.
        /// If validation is provided, and it fails, false will be returned.
        /// </summary>
        /// <param name = "value">The underlying type.</param>
        /// <param name = "vo">An instance of the value object.</param>
        /// <returns>True if the value object can be built, otherwise false.</returns>
        
#pragma warning disable CS8767 // Nullability of reference types in type of parameter doesn't match implicitly implemented member because of nullability attributes.

        public static bool TryFrom(
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        System.DateTime value, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.MaybeNullWhen(false)]
#endif
        out HireDate vo)
#pragma warning restore CS8767 // Nullability of reference types in type of parameter doesn't match implicitly implemented member because of nullability attributes.

        {
            vo = new HireDate(value);
            return true;
        }

        /// <summary>
        /// Tries to build an instance from the provided underlying value.
        /// If a normalization method is provided, it will be called.
        /// If validation is provided, and it fails, an error will be returned.
        /// </summary>
        /// <param name = "value">The primitive value.</param>
        /// <returns>A <see cref = "Vogen.ValueObjectOrError{T}"/> containing either the value object, or an error.</returns>
        public static Vogen.ValueObjectOrError<HireDate> TryFrom(System.DateTime value)
        {
            return new Vogen.ValueObjectOrError<HireDate>(new HireDate(value));
        }

        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
#if VOGEN_NO_VALIDATION
#pragma warning disable CS8775
  public readonly bool IsInitialized() => true;
#pragma warning restore CS8775
#else
        public readonly bool IsInitialized() => _isInitialized;
#endif
        public static explicit operator HireDate(System.DateTime value) => From(value);
        public static explicit operator System.DateTime(HireDate value) => value.Value;
        // only called internally when something has been deserialized into
        // its primitive type.
        private static HireDate __Deserialize(System.DateTime value)
        {
            return new HireDate(value);
        }

        public readonly global::System.Boolean Equals(HireDate other)
        {
            // It's possible to create uninitialized instances via converters such as EfCore (HasDefaultValue), which call Equals.
            // We treat anything uninitialized as not equal to anything, even other uninitialized instances of this type.
            if (!IsInitialized() || !other.IsInitialized())
                return false;
            return global::System.Collections.Generic.EqualityComparer<System.DateTime>.Default.Equals(Value, other.Value);
        }

        public global::System.Boolean Equals(HireDate other, global::System.Collections.Generic.IEqualityComparer<HireDate> comparer)
        {
            return comparer.Equals(this, other);
        }

        public readonly global::System.Boolean Equals(System.DateTime primitive)
        {
            return Value.Equals(primitive);
        }

        public readonly override global::System.Boolean Equals(global::System.Object obj)
        {
            return obj is HireDate && Equals((HireDate)obj);
        }

        public static global::System.Boolean operator ==(HireDate left, HireDate right) => left.Equals(right);
        public static global::System.Boolean operator !=(HireDate left, HireDate right) => !(left == right);
        public static global::System.Boolean operator ==(HireDate left, System.DateTime right) => left.Value.Equals(right);
        public static global::System.Boolean operator ==(System.DateTime left, HireDate right) => right.Value.Equals(left);
        public static global::System.Boolean operator !=(System.DateTime left, HireDate right) => !(left == right);
        public static global::System.Boolean operator !=(HireDate left, System.DateTime right) => !(left == right);
        public int CompareTo(HireDate other) => Value.CompareTo(other.Value);
        public int CompareTo(object other)
        {
            if (other is null)
                return 1;
            if (other is HireDate x)
                return CompareTo(x);
            ThrowHelper.ThrowArgumentException("Cannot compare to object as it is not of type HireDate", nameof(other));
            return 0;
        }

        /// <inheritdoc cref = "System.DateTime.TryParse(System.ReadOnlySpan{char}, out System.DateTime)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(global::System.ReadOnlySpan<char> s, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out HireDate result)
        {
            if (System.DateTime.TryParse(s, out var __v))
            {
                result = new HireDate(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "System.DateTime.TryParse(System.ReadOnlySpan{char}, System.IFormatProvider? , out System.DateTime)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(global::System.ReadOnlySpan<char> s, global::System.IFormatProvider provider, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out HireDate result)
        {
            if (System.DateTime.TryParse(s, provider, out var __v))
            {
                result = new HireDate(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "System.DateTime.TryParse(System.ReadOnlySpan{char}, System.IFormatProvider? , System.Globalization.DateTimeStyles, out System.DateTime)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(global::System.ReadOnlySpan<char> s, global::System.IFormatProvider provider, global::System.Globalization.DateTimeStyles styles, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out HireDate result)
        {
            if (System.DateTime.TryParse(s, provider, styles, out var __v))
            {
                result = new HireDate(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "System.DateTime.TryParse(string? , out System.DateTime)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(string s, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out HireDate result)
        {
            if (System.DateTime.TryParse(s, out var __v))
            {
                result = new HireDate(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "System.DateTime.TryParse(string? , System.IFormatProvider? , out System.DateTime)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(string s, global::System.IFormatProvider provider, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out HireDate result)
        {
            if (System.DateTime.TryParse(s, provider, out var __v))
            {
                result = new HireDate(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "System.DateTime.TryParse(string? , System.IFormatProvider? , System.Globalization.DateTimeStyles, out System.DateTime)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(string s, global::System.IFormatProvider provider, global::System.Globalization.DateTimeStyles styles, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out HireDate result)
        {
            if (System.DateTime.TryParse(s, provider, styles, out var __v))
            {
                result = new HireDate(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "System.DateTime.Parse(System.ReadOnlySpan{char}, System.IFormatProvider? )"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static HireDate Parse(global::System.ReadOnlySpan<char> s, global::System.IFormatProvider provider)
        {
            var r = System.DateTime.Parse(s, provider);
            return From(r);
        }

        /// <inheritdoc cref = "System.DateTime.Parse(System.ReadOnlySpan{char}, System.IFormatProvider? , System.Globalization.DateTimeStyles)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static HireDate Parse(global::System.ReadOnlySpan<char> s, global::System.IFormatProvider provider, global::System.Globalization.DateTimeStyles styles)
        {
            var r = System.DateTime.Parse(s, provider, styles);
            return From(r);
        }

        /// <inheritdoc cref = "System.DateTime.Parse(string)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static HireDate Parse(string s)
        {
            var r = System.DateTime.Parse(s);
            return From(r);
        }

        /// <inheritdoc cref = "System.DateTime.Parse(string, System.IFormatProvider? )"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static HireDate Parse(string s, global::System.IFormatProvider provider)
        {
            var r = System.DateTime.Parse(s, provider);
            return From(r);
        }

        /// <inheritdoc cref = "System.DateTime.Parse(string, System.IFormatProvider? , System.Globalization.DateTimeStyles)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static HireDate Parse(string s, global::System.IFormatProvider provider, global::System.Globalization.DateTimeStyles styles)
        {
            var r = System.DateTime.Parse(s, provider, styles);
            return From(r);
        }

#nullable disable
        /// <inheritdoc cref = "System.DateTime.ToString(string? , System.IFormatProvider? )"/>
        public string ToString([System.Diagnostics.CodeAnalysis.StringSyntaxAttribute("DateTimeFormat")] string format, global::System.IFormatProvider provider)
        {
            return IsInitialized() ? Value.ToString(format, provider) : "[UNINITIALIZED]";
        }

        /// <inheritdoc cref = "System.DateTime.TryFormat(System.Span{char}, out int, System.ReadOnlySpan{char}, System.IFormatProvider? )"/>
        public bool TryFormat(global::System.Span<char> destination, out int charsWritten, [System.Diagnostics.CodeAnalysis.StringSyntaxAttribute("DateTimeFormat")] global::System.ReadOnlySpan<char> format, global::System.IFormatProvider provider)
        {
            charsWritten = default;
            return IsInitialized() ? Value.TryFormat(destination, out charsWritten, format, provider) : true;
        }

        /// <inheritdoc cref = "System.DateTime.TryFormat(System.Span{byte}, out int, System.ReadOnlySpan{char}, System.IFormatProvider? )"/>
        public bool TryFormat(global::System.Span<byte> utf8Destination, out int bytesWritten, [System.Diagnostics.CodeAnalysis.StringSyntaxAttribute("DateTimeFormat")] global::System.ReadOnlySpan<char> format, global::System.IFormatProvider provider)
        {
            bytesWritten = default;
            return IsInitialized() ? Value.TryFormat(utf8Destination, out bytesWritten, format, provider) : true;
        }

#nullable restore
        public readonly override global::System.Int32 GetHashCode()
        {
            return global::System.Collections.Generic.EqualityComparer<System.DateTime>.Default.GetHashCode(Value);
        }

        /// <inheritdoc cref = "System.DateTime.ToString()"/>
        public override global::System.String ToString() => IsInitialized() ? Value.ToString() ?? "" : "[UNINITIALIZED]";
        /// <inheritdoc cref = "System.DateTime.ToString(System.IFormatProvider? )"/>
        public global::System.String ToString(global::System.IFormatProvider provider) => IsInitialized() ? Value.ToString(provider) ?? "" : "[UNINITIALIZED]";
        /// <inheritdoc cref = "System.DateTime.ToString(string? )"/>
        public global::System.String ToString([System.Diagnostics.CodeAnalysis.StringSyntaxAttribute("DateTimeFormat")] string format) => IsInitialized() ? Value.ToString(format) ?? "" : "[UNINITIALIZED]";
        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
        private readonly void EnsureInitialized()
        {
            if (!IsInitialized())
            {
#if DEBUG
               ThrowHelper.ThrowWhenNotInitialized(_stackTrace);
#else
                ThrowHelper.ThrowWhenNotInitialized();
#endif
            }
        }

#nullable disable
        /// <summary>
        /// Converts a HireDate to or from JSON.
        /// </summary>
        public class HireDateSystemTextJsonConverter : global::System.Text.Json.Serialization.JsonConverter<HireDate>
        {
            public override HireDate Read(ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options)
            {
                return DeserializeJson(reader.GetDateTime().ToUniversalTime());
            }

            public override void Write(System.Text.Json.Utf8JsonWriter writer, HireDate value, global::System.Text.Json.JsonSerializerOptions options)
            {
                writer.WriteStringValue(value.Value.ToUniversalTime());
            }

#if NET6_0_OR_GREATER
            /// <summary>
            /// Converts a HireDate to or from JSON.
            /// </summary>
            public override HireDate ReadAsPropertyName(ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options)
            {
                return DeserializeJson(global::System.DateTime.ParseExact(reader.GetString(), "O", global::System.Globalization.CultureInfo.InvariantCulture, global::System.Globalization.DateTimeStyles.RoundtripKind));
            }

            public override void WriteAsPropertyName(System.Text.Json.Utf8JsonWriter writer, HireDate value, global::System.Text.Json.JsonSerializerOptions options)
            {
                writer.WritePropertyName(value.Value.ToUniversalTime().ToString("O", global::System.Globalization.CultureInfo.InvariantCulture));
            }
#endif
#if NETCOREAPP3_0_OR_GREATER
            [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            private static void ThrowJsonExceptionWhenValidationFails(Vogen.Validation validation)
            {
                var e = ThrowHelper.CreateValidationException(validation);
                throw new global::System.Text.Json.JsonException(null, e);
            }

            public static HireDate DeserializeJson(System.DateTime value)
            {
                return new HireDate(value);
            }
        }

#nullable restore
#nullable disable
        class HireDateTypeConverter : global::System.ComponentModel.TypeConverter
        {
            public override global::System.Boolean CanConvertFrom(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Type sourceType)
            {
                return sourceType == typeof(global::System.DateTime) || sourceType == typeof(global::System.String) || base.CanConvertFrom(context, sourceType);
            }

            public override global::System.Object ConvertFrom(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Globalization.CultureInfo culture, global::System.Object value)
            {
                return value switch
                {
                    global::System.String stringValue when !global::System.String.IsNullOrEmpty(stringValue) && global::System.DateTime.TryParseExact(stringValue, "O", culture, global::System.Globalization.DateTimeStyles.RoundtripKind, out var result) => HireDate.__Deserialize(result),
                    global::System.DateTime dateTimeValue => HireDate.__Deserialize(dateTimeValue),
                    _ => base.ConvertFrom(context, culture, value),
                };
            }

            public override bool CanConvertTo(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Type sourceType)
            {
                return sourceType == typeof(global::System.DateTime) || sourceType == typeof(global::System.String) || base.CanConvertTo(context, sourceType);
            }

            public override object ConvertTo(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Globalization.CultureInfo culture, global::System.Object value, global::System.Type destinationType)
            {
                if (value is HireDate idValue)
                {
                    if (destinationType == typeof(global::System.DateTime))
                    {
                        return idValue.Value;
                    }

                    if (destinationType == typeof(global::System.String))
                    {
                        return idValue.Value.ToString("O", culture);
                    }
                }

                return base.ConvertTo(context, culture, value, destinationType);
            }
        }

#nullable restore
#nullable disable
        internal sealed class HireDateDebugView
        {
            private readonly HireDate _t;
            HireDateDebugView(HireDate t)
            {
                _t = t;
            }

            public global::System.Boolean IsInitialized => _t.IsInitialized();
            public global::System.String UnderlyingType => "System.DateTime";
            public global::System.String Value => _t.IsInitialized() ? _t._value.ToString() : "[not initialized]";
#if DEBUG
        public global::System.String CreatedWith => _t._stackTrace.ToString() ?? "the From method";
#endif
            public global::System.String Conversions => @"Default";
        }

#nullable restore
        static class ThrowHelper
        {
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowInvalidOperationException(string message) => throw new global::System.InvalidOperationException(message);
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowArgumentException(string message, string arg) => throw new global::System.ArgumentException(message, arg);
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenCreatedWithNull() => throw CreateCannotBeNullException();
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenNotInitialized() => throw CreateValidationException("Use of uninitialized Value Object.");
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenNotInitialized(global::System.Diagnostics.StackTrace stackTrace) => throw CreateValidationException("Use of uninitialized Value Object at: " + stackTrace ?? "");
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenValidationFails(Vogen.Validation validation)
            {
                throw CreateValidationException(validation);
            }

            internal static System.Exception CreateValidationException(string message) => new global::Vogen.ValueObjectValidationException(message);
            internal static System.Exception CreateCannotBeNullException() => new global::Vogen.ValueObjectValidationException("Cannot create a value object with null.");
            internal static System.Exception CreateValidationException(Vogen.Validation validation)
            {
                var ex = CreateValidationException(validation.ErrorMessage);
                if (validation.Data is not null)
                {
                    foreach (var kvp in validation.Data)
                    {
                        ex.Data[kvp.Key] = kvp.Value;
                    }
                }

                return ex;
            }
        }
    }
}
  
// ------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a source generator named Vogen (https://github.com/SteveDunn/Vogen)
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
// ------------------------------------------------------------------------------
// Suppress warnings about [Obsolete] member usage in generated code.
#pragma warning disable CS0618
// Suppress warnings for 'Override methods on comparable types'.
#pragma warning disable CA1036
// Suppress Error MA0097 : A class that implements IComparable<T> or IComparable should override comparison operators
#pragma warning disable MA0097
// Suppress warning for 'The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.'
// The generator copies signatures from the BCL, e.g. for `TryParse`, and some of those have nullable annotations.
#pragma warning disable CS8669, CS8632
// Suppress warnings about CS1591: Missing XML comment for publicly visible type or member 'Type_or_Member'
#pragma warning disable CS1591
namespace Foo
{
    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Vogen", "1.0.0.0")]
    [global::System.Text.Json.Serialization.JsonConverter(typeof(NameSystemTextJsonConverter))]
    [global::System.ComponentModel.TypeConverter(typeof(NameTypeConverter))]
    [global::System.Diagnostics.DebuggerTypeProxyAttribute(typeof(NameDebugView))]
    [global::System.Diagnostics.DebuggerDisplayAttribute("Underlying type: System.String, Value = { _value }")]
    // ReSharper disable once UnusedType.Global
    public partial struct Name : global::System.IEquatable<Name>, global::System.IEquatable<System.String>, global::System.IComparable<Name>, global::System.IComparable, global::System.IParsable<Name>
    {
#if DEBUG
private readonly global::System.Diagnostics.StackTrace _stackTrace = null!;
#endif
#if !VOGEN_NO_VALIDATION
        private readonly global::System.Boolean _isInitialized;
#endif
        private readonly System.String _value;
        /// <summary>
        /// Gets the underlying <see cref = "System.String"/> value if set, otherwise a <see cref = "Vogen.ValueObjectValidationException"/> is thrown.
        /// </summary>
        public readonly System.String Value
        {
            [global::System.Diagnostics.DebuggerStepThroughAttribute]
            [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
            get
            {
                EnsureInitialized();
                return _value;
            }
        }

        [global::System.Diagnostics.DebuggerStepThroughAttribute]
        [global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
        public Name()
        {
#if DEBUG
            _stackTrace = new global::System.Diagnostics.StackTrace();
#endif
#if !VOGEN_NO_VALIDATION
            _isInitialized = false;
#endif
            _value = default;
        }

        [global::System.Diagnostics.DebuggerStepThroughAttribute]
        private Name(System.String value)
        {
            _value = value;
#if !VOGEN_NO_VALIDATION
            _isInitialized = true;
#endif
        }

        /// <summary>
        /// Builds an instance from the provided underlying type.
        /// </summary>
        /// <param name = "value">The underlying type.</param>
        /// <returns>An instance of this type.</returns>
        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
        public static Name From(System.String value)
        {
            return new Name(value);
        }

        /// <summary>
        /// Tries to build an instance from the provided underlying type.
        /// If a normalization method is provided, it will be called.
        /// If validation is provided, and it fails, false will be returned.
        /// </summary>
        /// <param name = "value">The underlying type.</param>
        /// <param name = "vo">An instance of the value object.</param>
        /// <returns>True if the value object can be built, otherwise false.</returns>
        
#pragma warning disable CS8767 // Nullability of reference types in type of parameter doesn't match implicitly implemented member because of nullability attributes.

        public static bool TryFrom(
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        System.String value, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.MaybeNullWhen(false)]
#endif
        out Name vo)
#pragma warning restore CS8767 // Nullability of reference types in type of parameter doesn't match implicitly implemented member because of nullability attributes.

        {
            if (value is null)
            {
                vo = default;
                return false;
            }

            vo = new Name(value);
            return true;
        }

        /// <summary>
        /// Tries to build an instance from the provided underlying value.
        /// If a normalization method is provided, it will be called.
        /// If validation is provided, and it fails, an error will be returned.
        /// </summary>
        /// <param name = "value">The primitive value.</param>
        /// <returns>A <see cref = "Vogen.ValueObjectOrError{T}"/> containing either the value object, or an error.</returns>
        public static Vogen.ValueObjectOrError<Name> TryFrom(System.String value)
        {
            if (value is null)
            {
                return new Vogen.ValueObjectOrError<Name>(Vogen.Validation.Invalid("The value provided was null"));
            }

            return new Vogen.ValueObjectOrError<Name>(new Name(value));
        }

        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
#if VOGEN_NO_VALIDATION
#pragma warning disable CS8775
  public readonly bool IsInitialized() => true;
#pragma warning restore CS8775
#else
        public readonly bool IsInitialized() => _isInitialized;
#endif
        public static explicit operator Name(System.String value) => From(value);
        public static explicit operator System.String(Name value) => value.Value;
        // only called internally when something has been deserialized into
        // its primitive type.
        private static Name __Deserialize(System.String value)
        {
            return new Name(value);
        }

        public readonly global::System.Boolean Equals(Name other)
        {
            // It's possible to create uninitialized instances via converters such as EfCore (HasDefaultValue), which call Equals.
            // We treat anything uninitialized as not equal to anything, even other uninitialized instances of this type.
            if (!IsInitialized() || !other.IsInitialized())
                return false;
            return global::System.Collections.Generic.EqualityComparer<System.String>.Default.Equals(Value, other.Value);
        }

        public global::System.Boolean Equals(Name other, global::System.Collections.Generic.IEqualityComparer<Name> comparer)
        {
            return comparer.Equals(this, other);
        }

        public readonly global::System.Boolean Equals(System.String primitive)
        {
            return Value.Equals(primitive);
        }

        public readonly global::System.Boolean Equals(System.String primitive, global::System.StringComparer comparer)
        {
            return comparer.Equals(Value, primitive);
        }

        public readonly override global::System.Boolean Equals(global::System.Object obj)
        {
            return obj is Name && Equals((Name)obj);
        }

        public static global::System.Boolean operator ==(Name left, Name right) => left.Equals(right);
        public static global::System.Boolean operator !=(Name left, Name right) => !(left == right);
        public static global::System.Boolean operator ==(Name left, System.String right) => left.Value.Equals(right);
        public static global::System.Boolean operator ==(System.String left, Name right) => right.Value.Equals(left);
        public static global::System.Boolean operator !=(System.String left, Name right) => !(left == right);
        public static global::System.Boolean operator !=(Name left, System.String right) => !(left == right);
        public int CompareTo(Name other) => Value.CompareTo(other.Value);
        public int CompareTo(object other)
        {
            if (other is null)
                return 1;
            if (other is Name x)
                return CompareTo(x);
            ThrowHelper.ThrowArgumentException("Cannot compare to object as it is not of type Name", nameof(other));
            return 0;
        }

        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        global::System.String s, global::System.IFormatProvider provider, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.MaybeNullWhen(false)]
#endif
        out Name result)
        {
            if (s is null)
            {
                result = default;
                return false;
            }

            result = new Name(s);
            return true;
        }

        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created via the <see cref = "From(global::System.String)"/> method.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static Name Parse(global::System.String s, global::System.IFormatProvider provider)
        {
            return From(s);
        }

#nullable disable
#nullable restore
        public readonly override global::System.Int32 GetHashCode()
        {
            return global::System.Collections.Generic.EqualityComparer<System.String>.Default.GetHashCode(Value);
        }

        /// <inheritdoc cref = "System.String.ToString()"/>
        public override global::System.String ToString() => IsInitialized() ? Value.ToString() ?? "" : "[UNINITIALIZED]";
        /// <inheritdoc cref = "System.String.ToString(System.IFormatProvider? )"/>
        public global::System.String ToString(global::System.IFormatProvider provider) => IsInitialized() ? Value.ToString(provider) ?? "" : "[UNINITIALIZED]";
        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
        private readonly void EnsureInitialized()
        {
            if (!IsInitialized())
            {
#if DEBUG
               ThrowHelper.ThrowWhenNotInitialized(_stackTrace);
#else
                ThrowHelper.ThrowWhenNotInitialized();
#endif
            }
        }

#nullable disable
        /// <summary>
        /// Converts a Name to or from JSON.
        /// </summary>
        public class NameSystemTextJsonConverter : global::System.Text.Json.Serialization.JsonConverter<Name>
        {
            public override Name Read(ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options)
            {
                return DeserializeJson(reader.GetString());
            }

            public override void Write(System.Text.Json.Utf8JsonWriter writer, Name value, global::System.Text.Json.JsonSerializerOptions options)
            {
                writer.WriteStringValue(value.Value);
            }

#if NET6_0_OR_GREATER
            public override Name ReadAsPropertyName(ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options)
            {
                return DeserializeJson(reader.GetString());
            }

            public override void WriteAsPropertyName(System.Text.Json.Utf8JsonWriter writer, Name value, global::System.Text.Json.JsonSerializerOptions options)
            {
                writer.WritePropertyName(value.Value);
            }
#endif
#if NETCOREAPP3_0_OR_GREATER
            [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            private static void ThrowJsonExceptionWhenValidationFails(Vogen.Validation validation)
            {
                var e = ThrowHelper.CreateValidationException(validation);
                throw new global::System.Text.Json.JsonException(null, e);
            }

            private static void ThrowJsonExceptionWhenNull(System.String value)
            {
                if (value == null)
                {
                    var e = ThrowHelper.CreateCannotBeNullException();
                    throw new global::System.Text.Json.JsonException(null, e);
                }
            }

            public static Name DeserializeJson(System.String value)
            {
                ThrowJsonExceptionWhenNull(value);
                return new Name(value);
            }
        }

#nullable restore
#nullable disable
        class NameTypeConverter : global::System.ComponentModel.TypeConverter
        {
            public override global::System.Boolean CanConvertFrom(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Type sourceType)
            {
                return sourceType == typeof(global::System.String) || base.CanConvertFrom(context, sourceType);
            }

            public override global::System.Object ConvertFrom(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Globalization.CultureInfo culture, global::System.Object value)
            {
                var stringValue = value as global::System.String;
                if (stringValue is not null)
                {
                    return Name.__Deserialize(stringValue);
                }

                return base.ConvertFrom(context, culture, value);
            }

            public override bool CanConvertTo(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Type sourceType)
            {
                return sourceType == typeof(global::System.String) || base.CanConvertTo(context, sourceType);
            }

            public override object ConvertTo(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Globalization.CultureInfo culture, global::System.Object value, global::System.Type destinationType)
            {
                if (value is Name idValue)
                {
                    if (destinationType == typeof(global::System.String))
                    {
                        return idValue.Value;
                    }
                }

                return base.ConvertTo(context, culture, value, destinationType);
            }
        }

#nullable restore
#nullable disable
        internal sealed class NameDebugView
        {
            private readonly Name _t;
            NameDebugView(Name t)
            {
                _t = t;
            }

            public global::System.Boolean IsInitialized => _t.IsInitialized();
            public global::System.String UnderlyingType => "System.String";
            public global::System.String Value => _t.IsInitialized() ? _t._value.ToString() : "[not initialized]";
#if DEBUG
        public global::System.String CreatedWith => _t._stackTrace.ToString() ?? "the From method";
#endif
            public global::System.String Conversions => @"Default";
        }

#nullable restore
        static class ThrowHelper
        {
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowInvalidOperationException(string message) => throw new global::System.InvalidOperationException(message);
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowArgumentException(string message, string arg) => throw new global::System.ArgumentException(message, arg);
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenCreatedWithNull() => throw CreateCannotBeNullException();
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenNotInitialized() => throw CreateValidationException("Use of uninitialized Value Object.");
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenNotInitialized(global::System.Diagnostics.StackTrace stackTrace) => throw CreateValidationException("Use of uninitialized Value Object at: " + stackTrace ?? "");
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenValidationFails(Vogen.Validation validation)
            {
                throw CreateValidationException(validation);
            }

            internal static System.Exception CreateValidationException(string message) => new global::Vogen.ValueObjectValidationException(message);
            internal static System.Exception CreateCannotBeNullException() => new global::Vogen.ValueObjectValidationException("Cannot create a value object with null.");
            internal static System.Exception CreateValidationException(Vogen.Validation validation)
            {
                var ex = CreateValidationException(validation.ErrorMessage);
                if (validation.Data is not null)
                {
                    foreach (var kvp in validation.Data)
                    {
                        ex.Data[kvp.Key] = kvp.Value;
                    }
                }

                return ex;
            }
        }
    }
}
  
// ------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a source generator named Vogen (https://github.com/SteveDunn/Vogen)
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
// ------------------------------------------------------------------------------
// Suppress warnings about [Obsolete] member usage in generated code.
#pragma warning disable CS0618
// Suppress warnings for 'Override methods on comparable types'.
#pragma warning disable CA1036
// Suppress Error MA0097 : A class that implements IComparable<T> or IComparable should override comparison operators
#pragma warning disable MA0097
// Suppress warning for 'The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source.'
// The generator copies signatures from the BCL, e.g. for `TryParse`, and some of those have nullable annotations.
#pragma warning disable CS8669, CS8632
// Suppress warnings about CS1591: Missing XML comment for publicly visible type or member 'Type_or_Member'
#pragma warning disable CS1591
namespace Foo
{
    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Vogen", "1.0.0.0")]
    [global::System.Text.Json.Serialization.JsonConverter(typeof(AgeSystemTextJsonConverter))]
    [global::System.ComponentModel.TypeConverter(typeof(AgeTypeConverter))]
    [global::System.Diagnostics.DebuggerTypeProxyAttribute(typeof(AgeDebugView))]
    [global::System.Diagnostics.DebuggerDisplayAttribute("Underlying type: System.Int32, Value = { _value }")]
    // ReSharper disable once UnusedType.Global
    public partial struct Age : global::System.IEquatable<Age>, global::System.IEquatable<System.Int32>, global::System.IComparable<Age>, global::System.IComparable, global::System.IParsable<Age>, global::System.ISpanParsable<Age>, global::System.IUtf8SpanParsable<Age>, global::System.IFormattable, global::System.ISpanFormattable, global::System.IUtf8SpanFormattable
    {
#if DEBUG
private readonly global::System.Diagnostics.StackTrace _stackTrace = null!;
#endif
#if !VOGEN_NO_VALIDATION
        private readonly global::System.Boolean _isInitialized;
#endif
        private readonly System.Int32 _value;
        /// <summary>
        /// Gets the underlying <see cref = "System.Int32"/> value if set, otherwise a <see cref = "Vogen.ValueObjectValidationException"/> is thrown.
        /// </summary>
        public readonly System.Int32 Value
        {
            [global::System.Diagnostics.DebuggerStepThroughAttribute]
            [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
            get
            {
                EnsureInitialized();
                return _value;
            }
        }

        [global::System.Diagnostics.DebuggerStepThroughAttribute]
        [global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
        public Age()
        {
#if DEBUG
            _stackTrace = new global::System.Diagnostics.StackTrace();
#endif
#if !VOGEN_NO_VALIDATION
            _isInitialized = false;
#endif
            _value = default;
        }

        [global::System.Diagnostics.DebuggerStepThroughAttribute]
        private Age(System.Int32 value)
        {
            _value = value;
#if !VOGEN_NO_VALIDATION
            _isInitialized = true;
#endif
        }

        /// <summary>
        /// Builds an instance from the provided underlying type.
        /// </summary>
        /// <param name = "value">The underlying type.</param>
        /// <returns>An instance of this type.</returns>
        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
        public static Age From(System.Int32 value)
        {
            return new Age(value);
        }

        /// <summary>
        /// Tries to build an instance from the provided underlying type.
        /// If a normalization method is provided, it will be called.
        /// If validation is provided, and it fails, false will be returned.
        /// </summary>
        /// <param name = "value">The underlying type.</param>
        /// <param name = "vo">An instance of the value object.</param>
        /// <returns>True if the value object can be built, otherwise false.</returns>
        
#pragma warning disable CS8767 // Nullability of reference types in type of parameter doesn't match implicitly implemented member because of nullability attributes.

        public static bool TryFrom(
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        System.Int32 value, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.MaybeNullWhen(false)]
#endif
        out Age vo)
#pragma warning restore CS8767 // Nullability of reference types in type of parameter doesn't match implicitly implemented member because of nullability attributes.

        {
            vo = new Age(value);
            return true;
        }

        /// <summary>
        /// Tries to build an instance from the provided underlying value.
        /// If a normalization method is provided, it will be called.
        /// If validation is provided, and it fails, an error will be returned.
        /// </summary>
        /// <param name = "value">The primitive value.</param>
        /// <returns>A <see cref = "Vogen.ValueObjectOrError{T}"/> containing either the value object, or an error.</returns>
        public static Vogen.ValueObjectOrError<Age> TryFrom(System.Int32 value)
        {
            return new Vogen.ValueObjectOrError<Age>(new Age(value));
        }

        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
#if VOGEN_NO_VALIDATION
#pragma warning disable CS8775
  public readonly bool IsInitialized() => true;
#pragma warning restore CS8775
#else
        public readonly bool IsInitialized() => _isInitialized;
#endif
        public static explicit operator Age(System.Int32 value) => From(value);
        public static explicit operator System.Int32(Age value) => value.Value;
        // only called internally when something has been deserialized into
        // its primitive type.
        private static Age __Deserialize(System.Int32 value)
        {
            return new Age(value);
        }

        public readonly global::System.Boolean Equals(Age other)
        {
            // It's possible to create uninitialized instances via converters such as EfCore (HasDefaultValue), which call Equals.
            // We treat anything uninitialized as not equal to anything, even other uninitialized instances of this type.
            if (!IsInitialized() || !other.IsInitialized())
                return false;
            return global::System.Collections.Generic.EqualityComparer<System.Int32>.Default.Equals(Value, other.Value);
        }

        public global::System.Boolean Equals(Age other, global::System.Collections.Generic.IEqualityComparer<Age> comparer)
        {
            return comparer.Equals(this, other);
        }

        public readonly global::System.Boolean Equals(System.Int32 primitive)
        {
            return Value.Equals(primitive);
        }

        public readonly override global::System.Boolean Equals(global::System.Object obj)
        {
            return obj is Age && Equals((Age)obj);
        }

        public static global::System.Boolean operator ==(Age left, Age right) => left.Equals(right);
        public static global::System.Boolean operator !=(Age left, Age right) => !(left == right);
        public static global::System.Boolean operator ==(Age left, System.Int32 right) => left.Value.Equals(right);
        public static global::System.Boolean operator ==(System.Int32 left, Age right) => right.Value.Equals(left);
        public static global::System.Boolean operator !=(System.Int32 left, Age right) => !(left == right);
        public static global::System.Boolean operator !=(Age left, System.Int32 right) => !(left == right);
        public int CompareTo(Age other) => Value.CompareTo(other.Value);
        public int CompareTo(object other)
        {
            if (other is null)
                return 1;
            if (other is Age x)
                return CompareTo(x);
            ThrowHelper.ThrowArgumentException("Cannot compare to object as it is not of type Age", nameof(other));
            return 0;
        }

        /// <inheritdoc cref = "int.TryParse(System.ReadOnlySpan{byte}, System.Globalization.NumberStyles, System.IFormatProvider? , out int)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(global::System.ReadOnlySpan<byte> utf8Text, global::System.Globalization.NumberStyles style, global::System.IFormatProvider provider, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out Age result)
        {
            if (System.Int32.TryParse(utf8Text, style, provider, out var __v))
            {
                result = new Age(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "int.TryParse(System.ReadOnlySpan{byte}, System.IFormatProvider? , out int)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(global::System.ReadOnlySpan<byte> utf8Text, global::System.IFormatProvider provider, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out Age result)
        {
            if (System.Int32.TryParse(utf8Text, provider, out var __v))
            {
                result = new Age(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "int.TryParse(System.ReadOnlySpan{byte}, out int)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(global::System.ReadOnlySpan<byte> utf8Text, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out Age result)
        {
            if (System.Int32.TryParse(utf8Text, out var __v))
            {
                result = new Age(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "int.TryParse(System.ReadOnlySpan{char}, System.Globalization.NumberStyles, System.IFormatProvider? , out int)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(global::System.ReadOnlySpan<char> s, global::System.Globalization.NumberStyles style, global::System.IFormatProvider provider, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out Age result)
        {
            if (System.Int32.TryParse(s, style, provider, out var __v))
            {
                result = new Age(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "int.TryParse(System.ReadOnlySpan{char}, System.IFormatProvider? , out int)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(global::System.ReadOnlySpan<char> s, global::System.IFormatProvider provider, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out Age result)
        {
            if (System.Int32.TryParse(s, provider, out var __v))
            {
                result = new Age(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "int.TryParse(System.ReadOnlySpan{char}, out int)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(global::System.ReadOnlySpan<char> s, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out Age result)
        {
            if (System.Int32.TryParse(s, out var __v))
            {
                result = new Age(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "int.TryParse(string? , System.Globalization.NumberStyles, System.IFormatProvider? , out int)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(string s, global::System.Globalization.NumberStyles style, global::System.IFormatProvider provider, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out Age result)
        {
            if (System.Int32.TryParse(s, style, provider, out var __v))
            {
                result = new Age(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "int.TryParse(string? , System.IFormatProvider? , out int)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(string s, global::System.IFormatProvider provider, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out Age result)
        {
            if (System.Int32.TryParse(s, provider, out var __v))
            {
                result = new Age(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "int.TryParse(string? , out int)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// True if the value could a) be parsed by the underlying type, and b) passes any validation (after running any optional normalization).
        /// </returns>
        public static global::System.Boolean TryParse(string s, 
#if NETCOREAPP3_0_OR_GREATER
[global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)]
#endif
        out Age result)
        {
            if (System.Int32.TryParse(s, out var __v))
            {
                result = new Age(__v);
                return true;
            }

            result = default;
            return false;
        }

        /// <inheritdoc cref = "int.Parse(System.ReadOnlySpan{byte}, System.Globalization.NumberStyles, System.IFormatProvider? )"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static Age Parse(global::System.ReadOnlySpan<byte> utf8Text, global::System.Globalization.NumberStyles style, global::System.IFormatProvider provider)
        {
            var r = System.Int32.Parse(utf8Text, style, provider);
            return From(r);
        }

        /// <inheritdoc cref = "int.Parse(System.ReadOnlySpan{byte}, System.IFormatProvider? )"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static Age Parse(global::System.ReadOnlySpan<byte> utf8Text, global::System.IFormatProvider provider)
        {
            var r = System.Int32.Parse(utf8Text, provider);
            return From(r);
        }

        /// <inheritdoc cref = "int.Parse(System.ReadOnlySpan{char}, System.Globalization.NumberStyles, System.IFormatProvider? )"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static Age Parse(global::System.ReadOnlySpan<char> s, global::System.Globalization.NumberStyles style, global::System.IFormatProvider provider)
        {
            var r = System.Int32.Parse(s, style, provider);
            return From(r);
        }

        /// <inheritdoc cref = "int.Parse(System.ReadOnlySpan{char}, System.IFormatProvider? )"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static Age Parse(global::System.ReadOnlySpan<char> s, global::System.IFormatProvider provider)
        {
            var r = System.Int32.Parse(s, provider);
            return From(r);
        }

        /// <inheritdoc cref = "int.Parse(string)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static Age Parse(string s)
        {
            var r = System.Int32.Parse(s);
            return From(r);
        }

        /// <inheritdoc cref = "int.Parse(string, System.Globalization.NumberStyles)"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static Age Parse(string s, global::System.Globalization.NumberStyles style)
        {
            var r = System.Int32.Parse(s, style);
            return From(r);
        }

        /// <inheritdoc cref = "int.Parse(string, System.Globalization.NumberStyles, System.IFormatProvider? )"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static Age Parse(string s, global::System.Globalization.NumberStyles style, global::System.IFormatProvider provider)
        {
            var r = System.Int32.Parse(s, style, provider);
            return From(r);
        }

        /// <inheritdoc cref = "int.Parse(string, System.IFormatProvider? )"/>
        /// <summary>
        /// </summary>
        /// <returns>
        /// The value created by calling the Parse method on the primitive.
        /// </returns>
        /// <exception cref = "global::Vogen.ValueObjectValidationException">Thrown when the value can be parsed, but is not valid.</exception>
        public static Age Parse(string s, global::System.IFormatProvider provider)
        {
            var r = System.Int32.Parse(s, provider);
            return From(r);
        }

#nullable disable
        /// <inheritdoc cref = "int.ToString(string? , System.IFormatProvider? )"/>
        public string ToString([System.Diagnostics.CodeAnalysis.StringSyntaxAttribute("NumericFormat")] string format, global::System.IFormatProvider provider)
        {
            return IsInitialized() ? Value.ToString(format, provider) : "[UNINITIALIZED]";
        }

        /// <inheritdoc cref = "int.TryFormat(System.Span{char}, out int, System.ReadOnlySpan{char}, System.IFormatProvider? )"/>
        public bool TryFormat(global::System.Span<char> destination, out int charsWritten, [System.Diagnostics.CodeAnalysis.StringSyntaxAttribute("NumericFormat")] global::System.ReadOnlySpan<char> format, global::System.IFormatProvider provider)
        {
            charsWritten = default;
            return IsInitialized() ? Value.TryFormat(destination, out charsWritten, format, provider) : true;
        }

        /// <inheritdoc cref = "int.TryFormat(System.Span{byte}, out int, System.ReadOnlySpan{char}, System.IFormatProvider? )"/>
        public bool TryFormat(global::System.Span<byte> utf8Destination, out int bytesWritten, [System.Diagnostics.CodeAnalysis.StringSyntaxAttribute("NumericFormat")] global::System.ReadOnlySpan<char> format, global::System.IFormatProvider provider)
        {
            bytesWritten = default;
            return IsInitialized() ? Value.TryFormat(utf8Destination, out bytesWritten, format, provider) : true;
        }

#nullable restore
        public readonly override global::System.Int32 GetHashCode()
        {
            return global::System.Collections.Generic.EqualityComparer<System.Int32>.Default.GetHashCode(Value);
        }

        /// <inheritdoc cref = "System.Int32.ToString()"/>
        public override global::System.String ToString() => IsInitialized() ? Value.ToString() ?? "" : "[UNINITIALIZED]";
        /// <inheritdoc cref = "System.Int32.ToString(System.IFormatProvider? )"/>
        public global::System.String ToString(global::System.IFormatProvider provider) => IsInitialized() ? Value.ToString(provider) ?? "" : "[UNINITIALIZED]";
        /// <inheritdoc cref = "System.Int32.ToString(string? )"/>
        public global::System.String ToString([System.Diagnostics.CodeAnalysis.StringSyntaxAttribute("NumericFormat")] string format) => IsInitialized() ? Value.ToString(format) ?? "" : "[UNINITIALIZED]";
        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
        private readonly void EnsureInitialized()
        {
            if (!IsInitialized())
            {
#if DEBUG
               ThrowHelper.ThrowWhenNotInitialized(_stackTrace);
#else
                ThrowHelper.ThrowWhenNotInitialized();
#endif
            }
        }

#nullable disable
        /// <summary>
        /// Converts a Age to or from JSON.
        /// </summary>
        public class AgeSystemTextJsonConverter : global::System.Text.Json.Serialization.JsonConverter<Age>
        {
            public override Age Read(ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options)
            {
#if NET5_0_OR_GREATER
                return DeserializeJson(global::System.Text.Json.JsonSerializer.Deserialize(ref reader, (global::System.Text.Json.Serialization.Metadata.JsonTypeInfo<global::System.Int32>)options.GetTypeInfo(typeof(global::System.Int32))));
#else
                return DeserializeJson(reader.GetInt32());
#endif
            }

            public override void Write(System.Text.Json.Utf8JsonWriter writer, Age value, global::System.Text.Json.JsonSerializerOptions options)
            {
#if NET5_0_OR_GREATER
                global::System.Text.Json.JsonSerializer.Serialize(writer, value.Value, options);
#else
                writer.WriteNumberValue(value.Value);
#endif
            }

#if NET6_0_OR_GREATER
            public override Age ReadAsPropertyName(ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options)
            {
                return DeserializeJson(global::System.Int32.Parse(reader.GetString(), global::System.Globalization.NumberStyles.Any, global::System.Globalization.CultureInfo.InvariantCulture));
            }

            public override void WriteAsPropertyName(System.Text.Json.Utf8JsonWriter writer, Age value, global::System.Text.Json.JsonSerializerOptions options)
            {
                writer.WritePropertyName(value.Value.ToString(global::System.Globalization.CultureInfo.InvariantCulture));
            }
#endif
#if NETCOREAPP3_0_OR_GREATER
            [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            private static void ThrowJsonExceptionWhenValidationFails(Vogen.Validation validation)
            {
                var e = ThrowHelper.CreateValidationException(validation);
                throw new global::System.Text.Json.JsonException(null, e);
            }

            public static Age DeserializeJson(System.Int32 value)
            {
                return new Age(value);
            }
        }

#nullable restore
#nullable disable
        class AgeTypeConverter : global::System.ComponentModel.TypeConverter
        {
            public override global::System.Boolean CanConvertFrom(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Type sourceType)
            {
                return sourceType == typeof(global::System.Int32) || sourceType == typeof(global::System.String) || base.CanConvertFrom(context, sourceType);
            }

            public override global::System.Object ConvertFrom(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Globalization.CultureInfo culture, global::System.Object value)
            {
                return value switch
                {
                    global::System.Int32 intValue => Age.__Deserialize(intValue),
                    global::System.String stringValue when !global::System.String.IsNullOrEmpty(stringValue) && global::System.Int32.TryParse(stringValue, out var result) => Age.__Deserialize(result),
                    _ => base.ConvertFrom(context, culture, value),
                };
            }

            public override bool CanConvertTo(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Type sourceType)
            {
                return sourceType == typeof(global::System.Int32) || sourceType == typeof(global::System.String) || base.CanConvertTo(context, sourceType);
            }

            public override object ConvertTo(global::System.ComponentModel.ITypeDescriptorContext context, global::System.Globalization.CultureInfo culture, global::System.Object value, global::System.Type destinationType)
            {
                if (value is Age idValue)
                {
                    if (destinationType == typeof(global::System.Int32))
                    {
                        return idValue.Value;
                    }

                    if (destinationType == typeof(global::System.String))
                    {
                        return idValue.Value.ToString();
                    }
                }

                return base.ConvertTo(context, culture, value, destinationType);
            }
        }

#nullable restore
#nullable disable
        internal sealed class AgeDebugView
        {
            private readonly Age _t;
            AgeDebugView(Age t)
            {
                _t = t;
            }

            public global::System.Boolean IsInitialized => _t.IsInitialized();
            public global::System.String UnderlyingType => "System.Int32";
            public global::System.String Value => _t.IsInitialized() ? _t._value.ToString() : "[not initialized]";
#if DEBUG
        public global::System.String CreatedWith => _t._stackTrace.ToString() ?? "the From method";
#endif
            public global::System.String Conversions => @"Default";
        }

#nullable restore
        static class ThrowHelper
        {
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowInvalidOperationException(string message) => throw new global::System.InvalidOperationException(message);
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowArgumentException(string message, string arg) => throw new global::System.ArgumentException(message, arg);
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenCreatedWithNull() => throw CreateCannotBeNullException();
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenNotInitialized() => throw CreateValidationException("Use of uninitialized Value Object.");
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenNotInitialized(global::System.Diagnostics.StackTrace stackTrace) => throw CreateValidationException("Use of uninitialized Value Object at: " + stackTrace ?? "");
#if NETCOREAPP3_0_OR_GREATER
    [global::System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute]
#endif
            internal static void ThrowWhenValidationFails(Vogen.Validation validation)
            {
                throw CreateValidationException(validation);
            }

            internal static System.Exception CreateValidationException(string message) => new global::Vogen.ValueObjectValidationException(message);
            internal static System.Exception CreateCannotBeNullException() => new global::Vogen.ValueObjectValidationException("Cannot create a value object with null.");
            internal static System.Exception CreateValidationException(Vogen.Validation validation)
            {
                var ex = CreateValidationException(validation.ErrorMessage);
                if (validation.Data is not null)
                {
                    foreach (var kvp in validation.Data)
                    {
                        ex.Data[kvp.Key] = kvp.Value;
                    }
                }

                return ex;
            }
        }
    }
}
]