Files
2026-10-23 18:46:50 +02:00

42 lines
1.5 KiB
C#

namespace Omika.Tests.Repositories;
/// <summary>
/// Lecture des paramètres positionnels d'un <c>INSERT</c> capturé par un fake
/// <c>IHfsqlConnection</c> : les <c>?</c> suivent l'ordre de la liste de colonnes,
/// ce qui permet d'assertir une colonne précise sans dépendre de son rang.
/// </summary>
internal static class HfsqlInsertParameters
{
/// <summary>
/// Retourne la valeur du paramètre correspondant à <paramref name="column"/>
/// dans l'<c>INSERT</c> décrit par <paramref name="sql"/>.
/// </summary>
public static object? ValueFor(string sql, IReadOnlyList<object?> parameters, string column)
{
ArgumentNullException.ThrowIfNull(sql);
ArgumentNullException.ThrowIfNull(parameters);
int open = sql.IndexOf('(');
int close = open < 0 ? -1 : sql.IndexOf(')', open);
if (open < 0 || close <= open)
{
throw new InvalidOperationException($"Instruction sans liste de colonnes : {sql}");
}
string[] columns = sql[(open + 1)..close]
.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
int index = Array.FindIndex(
columns,
name => string.Equals(name, column, StringComparison.OrdinalIgnoreCase));
if (index < 0)
{
throw new InvalidOperationException($"Colonne « {column} » absente de l'instruction : {sql}");
}
return parameters[index];
}
}