|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Generic;
namespace Microsoft.Build.TaskHost.BackEnd;
/// <summary>
/// This class provides helper methods to adapt from <see cref="NodePacketValueFactory{T}"/> to
/// <see cref="ObjectTranslator{T}"/>.
/// </summary>
internal static class TranslatorHelpers
{
/// <summary>
/// Translates an object implementing <see cref="ITranslatable"/> which does not expose a
/// public parameterless constructor.
/// </summary>
/// <typeparam name="T">The reference type.</typeparam>
/// <param name="translator">The translator.</param>
/// <param name="instance">The value to be translated.</param>
/// <param name="valueFactory">The factory method used to instantiate values of type T.</param>
public static void Translate<T>(
this ITranslator translator,
ref T instance,
NodePacketValueFactory<T> valueFactory)
where T : class, ITranslatable
{
if (!translator.TranslateNullable(instance))
{
return;
}
if (translator.Mode == TranslationDirection.ReadFromStream)
{
instance = valueFactory(translator);
}
else
{
instance.Translate(translator);
}
}
private static ObjectTranslatorWithValueFactory<T> AdaptFactory<T>(NodePacketValueFactory<T> valueFactory)
where T : class, ITranslatable
=> static (ITranslator translator, NodePacketValueFactory<T> valueFactory, ref T objectToTranslate)
=> translator.Translate(ref objectToTranslate, valueFactory);
public static void TranslateDictionary<T>(
this ITranslator translator,
ref Dictionary<string, T>? dictionary,
IEqualityComparer<string> comparer,
NodePacketValueFactory<T> valueFactory)
where T : class, ITranslatable
=> translator.TranslateDictionary(ref dictionary, comparer, AdaptFactory(valueFactory), valueFactory);
}
|