// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Globalization; namespace Microsoft.AspNetCore.Blazor.Components { /// /// Methods used internally by @bind syntax. Not intended to be used directly. /// public static class BindMethods { /// /// Not intended to be used directly. /// public static T GetValue(T value) => value; /// /// Not intended to be used directly. /// public static string GetValue(DateTime value, string format) => value == default ? null : (format == null ? value.ToString() : value.ToString(format)); /// /// Not intended to be used directly. /// public static UIEventHandler SetValueHandler(Action setter, string existingValue) { return _ => setter((string)((UIChangeEventArgs)_).Value); } /// /// Not intended to be used directly. /// public static UIEventHandler SetValueHandler(Action setter, bool existingValue) { return _ => setter((bool)((UIChangeEventArgs)_).Value); } /// /// Not intended to be used directly. /// public static UIEventHandler SetValueHandler(Action setter, int existingValue) { return _ => setter(int.Parse((string)((UIChangeEventArgs)_).Value)); } /// /// Not intended to be used directly. /// public static UIEventHandler SetValueHandler(Action setter, DateTime existingValue) { return _ => SetDateTimeValue(setter, (object)((UIChangeEventArgs)_).Value, null); } /// /// Not intended to be used directly. /// public static UIEventHandler SetValueHandler(Action setter, DateTime existingValue, string format) { return _ => SetDateTimeValue(setter, (object)((UIChangeEventArgs)_).Value, format); } /// /// Not intended to be used directly. /// public static UIEventHandler SetValueHandler(Action setter, T existingValue) { if (!typeof(T).IsEnum) { throw new ArgumentException($"'bind' does not accept values of type {typeof(T).FullName}. To read and write this value type, wrap it in a property of type string with suitable getters and setters."); } return _ => { var value = (string)((UIChangeEventArgs)_).Value; var parsed = (T)Enum.Parse(typeof(T), value); setter(parsed); }; } /// /// Not intended to be used directly. /// public static Action SetValue(Action setter, string existingValue) => objValue => setter((string)objValue); /// /// Not intended to be used directly. /// public static Action SetValue(Action setter, bool existingValue) => objValue => setter((bool)objValue); /// /// Not intended to be used directly. /// public static Action SetValue(Action setter, int existingValue) => objValue => setter(int.Parse((string)objValue)); /// /// Not intended to be used directly. /// public static Action SetValue(Action setter, T existingValue) => objValue => { if (typeof(T).IsEnum) { var parsedValue = Enum.Parse(typeof(T), (string)objValue); setter((T)parsedValue); } else { throw new ArgumentException($"@bind syntax does not accept values of type {typeof(T).FullName}. To read and write this value type, wrap it in a property of type string with suitable getters and setters."); } }; /// /// Not intended to be used directly. /// public static Action SetValue(Action setter, DateTime existingValue) => objValue => SetDateTimeValue(setter, objValue, null); /// /// Not intended to be used directly. /// public static Action SetValue(Action setter, DateTime existingValue, string format) => objValue => SetDateTimeValue(setter, objValue, format); private static void SetDateTimeValue(Action setter, object objValue, string format) { var stringValue = (string)objValue; var parsedValue = string.IsNullOrEmpty(stringValue) ? default : format != null && DateTime.TryParseExact(stringValue, format, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var parsedExact) ? parsedExact : DateTime.Parse(stringValue); setter(parsedValue); } } }