MustacheSharp/MustacheSharp/ArgumentCollection.cs

69 lines
2.5 KiB
C#

using System.Collections.Generic;
using System.Linq;
namespace Mustache
{
/// <summary>
/// Associates parameters to their argument values.
/// </summary>
internal sealed class ArgumentCollection
{
private readonly Dictionary<TagParameter, IArgument> _argumentLookup = new Dictionary<TagParameter, IArgument>();
/// <summary>
/// Associates the given parameter to the key placeholder.
/// </summary>
/// <param name="parameter">The parameter to associate the key with.</param>
/// <param name="key">The argument.</param>
/// <remarks>If the key is null, the default value of the parameter will be used.</remarks>
public void AddArgument(TagParameter parameter, IArgument argument)
{
_argumentLookup.Add(parameter, argument);
}
/// <summary>
/// Gets the key that will be used to find the substitute value.
/// </summary>
/// <param name="parameterName">The name of the parameter.</param>
public string GetKey(TagParameter parameter)
{
if (_argumentLookup.TryGetValue(parameter, out IArgument argument) && argument != null)
{
return argument.GetKey();
}
return null;
}
/// <summary>
/// Substitutes the key placeholders with their respective values.
/// </summary>
/// <param name="keyScope">The key/value pairs in the current lexical scope.</param>
/// <param name="contextScope">The key/value pairs in current context.</param>
/// <returns>A dictionary associating the parameter name to the associated value.</returns>
public Dictionary<string, object> GetArguments(Scope keyScope, Scope contextScope)
{
Dictionary<string, object> arguments = new Dictionary<string,object>();
foreach (KeyValuePair<TagParameter, IArgument> pair in _argumentLookup)
{
object value;
if (pair.Value == null)
{
value = pair.Key.DefaultValue;
}
else
{
value = pair.Value.GetValue(keyScope, contextScope);
}
arguments.Add(pair.Key.Name, value);
}
return arguments;
}
public Dictionary<string, object> GetArgumentKeyNames()
{
return _argumentLookup.ToDictionary(p => p.Key.Name, p => (object)GetKey(p.Key));
}
}
}