// Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; using System.Collections.Generic; using Microsoft.Build.Construction; using Microsoft.DotNet.ProjectJsonMigration.Models; namespace Microsoft.DotNet.ProjectJsonMigration.Transforms { public class AddItemTransform : ConditionalTransform { private readonly ProjectRootElement _itemObjectGenerator = ProjectRootElement.Create(); private readonly string _itemName; private readonly string _includeValue; private readonly string _excludeValue; private readonly Func _includeValueFunc; private readonly Func _excludeValueFunc; private readonly List> _metadata = new List>(); public AddItemTransform( string itemName, IEnumerable includeValues, IEnumerable excludeValues, Func condition) : this(itemName, string.Join(";", includeValues), string.Join(";", excludeValues), condition) { } public AddItemTransform( string itemName, Func includeValueFunc, Func excludeValueFunc, Func condition) : base(condition) { _itemName = itemName; _includeValueFunc = includeValueFunc; _excludeValueFunc = excludeValueFunc; } public AddItemTransform( string itemName, string includeValue, Func excludeValueFunc, Func condition) : base(condition) { _itemName = itemName; _includeValue = includeValue; _excludeValueFunc = excludeValueFunc; } public AddItemTransform( string itemName, Func includeValueFunc, string excludeValue, Func condition) : base(condition) { _itemName = itemName; _includeValueFunc = includeValueFunc; _excludeValue = excludeValue; } public AddItemTransform( string itemName, string includeValue, string excludeValue, Func condition) : base(condition) { _itemName = itemName; _includeValue = includeValue; _excludeValue = excludeValue; } public AddItemTransform WithMetadata(string metadataName, string metadataValue) { _metadata.Add(new ItemMetadataValue(metadataName, metadataValue)); return this; } public AddItemTransform WithMetadata(string metadataName, Func metadataValueFunc, Func writeMetadataFunc = null) { _metadata.Add(new ItemMetadataValue(metadataName, metadataValueFunc, writeMetadataFunc)); return this; } public AddItemTransform WithMetadata(ItemMetadataValue metadata) { _metadata.Add(metadata); return this; } public override ProjectItemElement ConditionallyTransform(T source) { string includeValue = _includeValue ?? _includeValueFunc(source); string excludeValue = _excludeValue ?? _excludeValueFunc(source); var item = _itemObjectGenerator.AddItem(_itemName, includeValue); item.Exclude = excludeValue; foreach (var metadata in _metadata) { if (metadata.ShouldWriteMetadata(source)) { item.AddMetadata(metadata.MetadataName, metadata.GetMetadataValue(source)); } } return item; } } }