#nullable enable
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Swan.Lite.Reflection;
using Swan.Mappers;
using Swan.Reflection;
namespace Swan {
///
/// Extension methods.
///
public static partial class Extensions {
///
/// Iterates over the public, instance, readable properties of the source and
/// tries to write a compatible value to a public, instance, writable property in the destination.
///
/// The type of the source.
/// The source.
/// The target.
/// The ignore properties.
///
/// Number of properties that was copied successful.
///
public static Int32 CopyPropertiesTo(this T source, Object? target, params String[]? ignoreProperties) where T : class => ObjectMapper.Copy(source, target, GetCopyableProperties(target), ignoreProperties);
/*///
/// Iterates over the public, instance, readable properties of the source and
/// tries to write a compatible value to a public, instance, writable property in the destination.
///
/// The source.
/// The destination.
/// Properties to copy.
///
/// Number of properties that were successfully copied.
///
public static Int32 CopyOnlyPropertiesTo(this Object source, Object target, params String[]? propertiesToCopy) => ObjectMapper.Copy(source, target, propertiesToCopy);*/
///
/// Copies the properties to new instance of T.
///
/// The new object type.
/// The source.
/// The ignore properties.
///
/// The specified type with properties copied.
///
/// source.
public static T CopyPropertiesToNew(this Object source, String[]? ignoreProperties = null) where T : class {
if(source == null) {
throw new ArgumentNullException(nameof(source));
}
T target = Activator.CreateInstance();
_ = ObjectMapper.Copy(source, target, GetCopyableProperties(target), ignoreProperties);
return target;
}
/*///
/// Copies the only properties to new instance of T.
///
/// Object Type.
/// The source.
/// The properties to copy.
///
/// The specified type with properties copied.
///
/// source.
public static T CopyOnlyPropertiesToNew(this Object source, params String[] propertiesToCopy) where T : class {
if(source == null) {
throw new ArgumentNullException(nameof(source));
}
T target = Activator.CreateInstance();
_ = ObjectMapper.Copy(source, target, propertiesToCopy);
return target;
}
///
/// Iterates over the keys of the source and tries to write a compatible value to a public,
/// instance, writable property in the destination.
///
/// The source.
/// The target.
/// The ignore keys.
/// Number of properties that was copied successful.
public static Int32 CopyKeyValuePairTo(this IDictionary source, Object? target, params String[] ignoreKeys) => source == null ? throw new ArgumentNullException(nameof(source)) : ObjectMapper.Copy(source, target, null, ignoreKeys);
///
/// Iterates over the keys of the source and tries to write a compatible value to a public,
/// instance, writable property in the destination.
///
/// Object Type.
/// The source.
/// The ignore keys.
///
/// The specified type with properties copied.
///
public static T CopyKeyValuePairToNew(this IDictionary source, params String[] ignoreKeys) {
if(source == null) {
throw new ArgumentNullException(nameof(source));
}
T target = Activator.CreateInstance();
_ = source.CopyKeyValuePairTo(target, ignoreKeys);
return target;
}
///
/// Does the specified action.
///
/// The action.
/// The retry interval.
/// The retry count.
public static void Retry(this Action action, TimeSpan retryInterval = default, Int32 retryCount = 3) {
if(action == null) {
throw new ArgumentNullException(nameof(action));
}
_ = Retry