src/Epam.GraphQL/Diagnostics/Internals/ObjectConfigurationContextBase.cs (128 lines of code) (raw):
// Copyright © 2020 EPAM Systems, Inc. All Rights Reserved. All information contained herein is, and remains the
// property of EPAM Systems, Inc. and/or its suppliers and is protected by international intellectual
// property law. Dissemination of this information or reproduction of this material is strictly forbidden,
// unless prior written permission is obtained from EPAM Systems, Inc
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Epam.GraphQL.Extensions;
namespace Epam.GraphQL.Diagnostics.Internals
{
internal abstract class ObjectConfigurationContextBase : ConfigurationContext, IRootConfigurationContext
{
private readonly List<ConfigurationException> _errors = new();
protected ObjectConfigurationContextBase(ConfigurationContext? parent)
: base(parent)
{
}
public void AppendBody(StringBuilder stringBuilder, IEnumerable<IConfigurationContext> choosenItems, int indent)
{
var indicies = new List<int>();
var choosenItemList = choosenItems.ToList();
if (choosenItemList.Count == 0)
{
indicies.AddRange(Enumerable.Range(0, Children.Count));
}
else
{
for (var i = 0; i < Children.Count; i++)
{
var index = choosenItemList.FindIndex(choosenItem => ReferenceEquals(choosenItem, Children[i]) || Children[i].Contains(choosenItem));
if (index >= 0)
{
if (i > 0)
{
indicies.Add(i - 1);
}
indicies.Add(i);
if (i < Children.Count - 1)
{
indicies.Add(i + 1);
}
}
}
indicies = indicies
.Distinct()
.OrderBy(index => index)
.ToList();
}
var nextIndex = 0;
foreach (var index in indicies)
{
if (index != nextIndex)
{
stringBuilder.Append(' ', 4 * indent);
stringBuilder.AppendLine("// ...");
stringBuilder.AppendLine();
}
if (nextIndex > 0)
{
stringBuilder.AppendLine();
}
var child = Children[index];
child.Append(stringBuilder, choosenItems, indent);
if (choosenItems.Contains(child))
{
stringBuilder.Append(" // <-----");
}
stringBuilder.AppendLine();
nextIndex = index + 1;
}
if (nextIndex != Children.Count)
{
if (indicies.Count > 0)
{
stringBuilder.AppendLine();
}
stringBuilder.Append(' ', 4 * indent);
stringBuilder.AppendLine("// ...");
}
}
public override void Clear()
{
base.Clear();
_errors.Clear();
}
public IChainConfigurationContext Chain(IChainConfigurationContextOwner owner, string operation)
{
return AddChild(new ChainConfigurationContext(owner, this, null, operation));
}
public IChainConfigurationContext Chain<T>(IChainConfigurationContextOwner owner, string operation)
{
return Chain(owner, $"{operation}<{typeof(T).HumanizedName()}>");
}
public void AddError(string message, params IConfigurationContext[] invalidItems)
{
_errors.Add(new ConfigurationException(GetError(message, invalidItems)));
}
public string GetError(string message, params IConfigurationContext[] invalidItems)
{
var builder = new StringBuilder();
builder.Append(DoGetError(message));
builder.AppendLine();
builder.AppendLine("Details:");
this.GetRoot().Append(builder, invalidItems, 0);
return builder.ToString();
}
public string GetRuntimeError(string message, params IConfigurationContext[] invalidItems)
{
var builder = new StringBuilder();
builder.Append(DoGetRuntimeError(message));
builder.AppendLine();
this.GetRoot().Append(builder, invalidItems, 0);
return builder.ToString();
}
public void ThrowErrors()
{
if (_errors.Count > 0)
{
throw new AggregateException(_errors);
}
}
protected virtual string DoGetError(string message)
{
return message;
}
protected virtual string DoGetRuntimeError(string message)
{
return message;
}
}
}