Extract arguments
ITemplateBreakdown.TryExtractArguments(input, out extractedarguments) tries to extract segments that correspond to placeholders from a printed string.
// Create template
ITemplateBreakdown breakdown = TemplateFormat.Brace.BreakdownCached["You have {0} apple(s)."];
// Create arguments
object?[] arguments = { 3 };
// Print
string print = breakdown.Print(CultureInfo.InvariantCulture, arguments); // "You have 3 apple(s)."
// Extract arguments
if (breakdown.TryExtractArguments(print, out ReadOnlyMemory<char>[] extractedArguments))
{
// Print extracted argument
WriteLine(extractedArguments[0]); // "3"
}
.TryExtractArguments(input, out extractedarguments) also reads from ReadOnlyMemory.
// Create template
ITemplateBreakdown breakdown = TemplateFormat.Brace.BreakdownCached["You have {0} apple(s)."];
// Create arguments
object?[] arguments = { 3 };
// Print
ReadOnlyMemory<char> print = breakdown.Print(CultureInfo.InvariantCulture, arguments).AsMemory(); // "You have 3 apple(s)."
// Extract arguments
if (breakdown.TryExtractArguments(print, out ReadOnlyMemory<char>[] extractedArguments))
{
// Print extracted argument
WriteLine(extractedArguments[0]); // "3"
}
Works with multiline input, multiline arguments and with unordered parameters.
// Create template
ITemplateBreakdown breakdown = TemplateFormat.Brace.BreakdownCached["Line 1: {2}\nLine2: {1}\nLine3: {0}"];
// Create arguments
object?[] arguments = { "Hello\nWorld", "Clown\nShow", "More\nFood" };
// Print
string print = breakdown.Print(CultureInfo.InvariantCulture, arguments);
// Extract arguments
if (breakdown.TryExtractArguments(print, out ReadOnlyMemory<char>[] extractedArguments))
{
// Print extracted argument
WriteLine(extractedArguments[0]); // "Hello\nWorld"
WriteLine(extractedArguments[1]); // "Clown\nShow"
WriteLine(extractedArguments[2]); // "More\nFood"
}
.TryExtractArgumentsTo(input, arguments) tries to extract into caller allocated array.
// Create template
ITemplateBreakdown breakdown = TemplateFormat.Brace.BreakdownCached["You have {0} apple(s)."];
// Create arguments
object?[] arguments = { 3 };
// Print
string print = breakdown.Print(CultureInfo.InvariantCulture, arguments); // "You have 3 apple(s)."
// Allocate
ReadOnlyMemory<char>[] argumentsToBeExtracted = ArrayPool<ReadOnlyMemory<char>>.Shared.Rent(1);
// Extract arguments
if (breakdown.TryExtractArgumentsTo(print, argumentsToBeExtracted))
{
// Print extracted argument
WriteLine(argumentsToBeExtracted[0]); // "3"
}
// Return arguments
ArrayPool<ReadOnlyMemory<char>>.Shared.Return(argumentsToBeExtracted);
.ExtractArguments(input) extracts arguments into an array. Throws InvalidOperationException if operation fails.
// Create template
ITemplateBreakdown breakdown = TemplateFormat.Brace.BreakdownCached["You have {0} apple(s)."];
// Create arguments
object?[] arguments = { 3 };
// Print
string print = breakdown.Print(CultureInfo.InvariantCulture, arguments); // "You have 3 apple(s)."
// Allocate
ReadOnlyMemory<char>[] extractedArguments = breakdown.ExtractArguments(print);
// Print extracted argument
WriteLine(extractedArguments[0]); // "3"
Full Example
Full example
using System.Buffers;
using System.Globalization;
using System.Text;
using Avalanche.Template;
using static System.Console;
public class templateextractpattern
{
public static void Run()
{
{
// <01>
// Create template
ITemplateBreakdown breakdown = TemplateFormat.Brace.BreakdownCached["You have {0} apple(s)."];
// Create arguments
object?[] arguments = { 3 };
// Print
string print = breakdown.Print(CultureInfo.InvariantCulture, arguments); // "You have 3 apple(s)."
// Extract arguments
if (breakdown.TryExtractArguments(print, out ReadOnlyMemory<char>[] extractedArguments))
{
// Print extracted argument
WriteLine(extractedArguments[0]); // "3"
}
// </01>
}
{
// <01B>
// Create template
ITemplateBreakdown breakdown = TemplateFormat.Brace.BreakdownCached["You have {0} apple(s)."];
// Create arguments
object?[] arguments = { 3 };
// Print
ReadOnlyMemory<char> print = breakdown.Print(CultureInfo.InvariantCulture, arguments).AsMemory(); // "You have 3 apple(s)."
// Extract arguments
if (breakdown.TryExtractArguments(print, out ReadOnlyMemory<char>[] extractedArguments))
{
// Print extracted argument
WriteLine(extractedArguments[0]); // "3"
}
// </01B>
}
{
// <02>
// Create template
ITemplateBreakdown breakdown = TemplateFormat.Brace.BreakdownCached["Line 1: {2}\nLine2: {1}\nLine3: {0}"];
// Create arguments
object?[] arguments = { "Hello\nWorld", "Clown\nShow", "More\nFood" };
// Print
string print = breakdown.Print(CultureInfo.InvariantCulture, arguments);
// Extract arguments
if (breakdown.TryExtractArguments(print, out ReadOnlyMemory<char>[] extractedArguments))
{
// Print extracted argument
WriteLine(extractedArguments[0]); // "Hello\nWorld"
WriteLine(extractedArguments[1]); // "Clown\nShow"
WriteLine(extractedArguments[2]); // "More\nFood"
}
// </02>
}
{
// <03>
// Create template
ITemplateBreakdown breakdown = TemplateFormat.Brace.BreakdownCached["You have {0} apple(s)."];
// Create arguments
object?[] arguments = { 3 };
// Print
string print = breakdown.Print(CultureInfo.InvariantCulture, arguments); // "You have 3 apple(s)."
// Allocate
ReadOnlyMemory<char>[] argumentsToBeExtracted = ArrayPool<ReadOnlyMemory<char>>.Shared.Rent(1);
// Extract arguments
if (breakdown.TryExtractArgumentsTo(print, argumentsToBeExtracted))
{
// Print extracted argument
WriteLine(argumentsToBeExtracted[0]); // "3"
}
// Return arguments
ArrayPool<ReadOnlyMemory<char>>.Shared.Return(argumentsToBeExtracted);
// </03>
}
{
// <04>
// Create template
ITemplateBreakdown breakdown = TemplateFormat.Brace.BreakdownCached["You have {0} apple(s)."];
// Create arguments
object?[] arguments = { 3 };
// Print
string print = breakdown.Print(CultureInfo.InvariantCulture, arguments); // "You have 3 apple(s)."
// Allocate
ReadOnlyMemory<char>[] extractedArguments = breakdown.ExtractArguments(print);
// Print extracted argument
WriteLine(extractedArguments[0]); // "3"
// </04>
}
}
}