You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
968 B
38 lines
968 B
using YamlDotNet.Core;
|
|
using YamlDotNet.Core.Events;
|
|
using YamlDotNet.Serialization;
|
|
|
|
namespace TrashLib.Config.Secrets;
|
|
|
|
public record SecretTag;
|
|
|
|
public class SecretsDeserializer : INodeDeserializer
|
|
{
|
|
private readonly ISecretsProvider _secrets;
|
|
|
|
public SecretsDeserializer(ISecretsProvider secrets)
|
|
{
|
|
_secrets = secrets;
|
|
}
|
|
|
|
public bool Deserialize(IParser reader, Type expectedType, Func<IParser, Type, object?> nestedObjectDeserializer,
|
|
out object? value)
|
|
{
|
|
// Only process items flagged as Secrets
|
|
if (expectedType != typeof(SecretTag))
|
|
{
|
|
value = null;
|
|
return false;
|
|
}
|
|
|
|
var secretKey = reader.Consume<Scalar>();
|
|
if (!_secrets.Secrets.TryGetValue(secretKey.Value, out var secretsValue))
|
|
{
|
|
throw new SecretNotFoundException(secretKey.Start.Line, secretKey.Value);
|
|
}
|
|
|
|
value = secretsValue;
|
|
return true;
|
|
}
|
|
}
|