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 nestedObjectDeserializer, out object? value) { // Only process items flagged as Secrets if (expectedType != typeof(SecretTag)) { value = null; return false; } var secretKey = reader.Consume(); if (!_secrets.Secrets.TryGetValue(secretKey.Value, out var secretsValue)) { throw new SecretNotFoundException(secretKey.Start.Line, secretKey.Value); } value = secretsValue; return true; } }