using Recyclarr.Common; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Serialization; namespace Recyclarr.TrashLib.Config.EnvironmentVariables; public record EnvironmentVariableTag; public class EnvironmentVariablesDeserializer : INodeDeserializer { private readonly IEnvironment _environment; public EnvironmentVariablesDeserializer(IEnvironment environment) { _environment = environment; } public bool Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, out object? value) { // Only process items flagged as Environment Variables if (expectedType != typeof(EnvironmentVariableTag)) { value = null; return false; } var scalar = reader.Consume(); var split = scalar.Value.Trim().Split(' ', 2); var envVarValue = _environment.GetEnvironmentVariable(split[0]); if (string.IsNullOrWhiteSpace(envVarValue)) { // Trim whitespace + quotation characters envVarValue = split.ElementAtOrDefault(1)?.Trim().Trim('\'', '"'); } value = envVarValue ?? throw new EnvironmentVariableNotDefinedException(scalar.Start.Line, scalar.Value); return true; } }