Beispiel #1
0
        private static void HandleIngressRuleMapping(YamlMappingNode yamlMappingNode, ConfigIngressRule rule)
        {
            foreach (var child in yamlMappingNode !.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "host":
                    rule.Host = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "path":
                    rule.Path = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "service":
                    rule.Service = YamlParser.GetScalarValue(key, child.Value).ToLowerInvariant();
                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }
        }
Beispiel #2
0
        public static Dictionary <string, object> GetDictionary(YamlNode node)
        {
            if (node.NodeType != YamlNodeType.Mapping)
            {
                throw new TyeYamlException(node.Start,
                                           CoreStrings.FormatUnexpectedType(YamlNodeType.Mapping.ToString(), node.NodeType.ToString()));
            }

            var dictionary = new Dictionary <string, object>();

            foreach (var mapping in (YamlMappingNode)node)
            {
                var key = YamlParser.GetScalarValue(mapping.Key);

                dictionary[key] = mapping.Value.NodeType switch
                {
                    YamlNodeType.Scalar => YamlParser.GetScalarValue(key, mapping.Value) !,
                    YamlNodeType.Mapping => YamlParser.GetDictionary(mapping.Value),
                    _ => throw new TyeYamlException(mapping.Value.Start,
                                                    CoreStrings.FormatUnexpectedType(YamlNodeType.Mapping.ToString(), mapping.Value.NodeType.ToString()))
                };
            }

            return(dictionary);
        }
Beispiel #3
0
        public static void HandleConfigApplication(YamlMappingNode yamlMappingNode, ConfigApplication app)
        {
            foreach (var child in yamlMappingNode.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "name":
                    app.Name = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "namespace":
                    app.Namespace = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "network":
                    app.Network = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "registry":
                    app.Registry = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "containerEngine":
                    string engine = YamlParser.GetScalarValue(key, child.Value);
                    if (engine.Equals("docker", StringComparison.InvariantCultureIgnoreCase))
                    {
                        app.ContainerEngineType = ContainerEngineType.Docker;
                    }
                    else if (engine.Equals("podman", StringComparison.InvariantCultureIgnoreCase))
                    {
                        app.ContainerEngineType = ContainerEngineType.Podman;
                    }
                    else
                    {
                        throw new TyeYamlException($"Unknown container engine: \"{engine}\"");
                    }
                    break;

                case "ingress":
                    YamlParser.ThrowIfNotYamlSequence(key, child.Value);
                    ConfigIngressParser.HandleIngress((child.Value as YamlSequenceNode) !, app.Ingress);
                    break;

                case "services":
                    YamlParser.ThrowIfNotYamlSequence(key, child.Value);
                    ConfigServiceParser.HandleServiceMapping((child.Value as YamlSequenceNode) !, app.Services, app);
                    break;

                case "extensions":
                    YamlParser.ThrowIfNotYamlSequence(key, child.Value);
                    ConfigExtensionsParser.HandleExtensionsMapping((child.Value as YamlSequenceNode) !, app.Extensions);
                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }
        }
Beispiel #4
0
        private static void HandleServiceProbeHttpHeader(YamlMappingNode yamlMappingNode, List <KeyValuePair <string, object> > headers)
        {
            string?name  = null;
            object?value = null;

            foreach (var child in yamlMappingNode.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "name":
                    name = YamlParser.GetScalarValue("name", child.Value);
                    break;

                case "value":
                    value = YamlParser.GetScalarValue("value", child.Value);
                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }

            if (name is null)
            {
                throw new TyeYamlException(yamlMappingNode.Start, CoreStrings.FormatExpectedYamlScalar("name"));
            }
            else if (value is null)
            {
                throw new TyeYamlException(yamlMappingNode.Start, CoreStrings.FormatExpectedYamlScalar("value"));
            }

            headers.Add(new KeyValuePair <string, object>(name, value));
        }
Beispiel #5
0
        private static void HandleServiceVolumeNameMapping(YamlMappingNode yamlMappingNode, ConfigVolume volume)
        {
            foreach (var child in yamlMappingNode !.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "name":
                    volume.Name = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "source":
                    volume.Source = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "target":
                    volume.Target = YamlParser.GetScalarValue(key, child.Value);
                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }
        }
Beispiel #6
0
        private static void HandleIngressBindingMapping(YamlMappingNode yamlMappingNode, ConfigIngressBinding binding)
        {
            foreach (var child in yamlMappingNode !.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "name":
                    binding.Name = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "port":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var port))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    binding.Port = port;
                    break;

                case "protocol":
                    binding.Protocol = YamlParser.GetScalarValue(key, child.Value);
                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }
        }
Beispiel #7
0
        private static void HandleIngressBindingMapping(YamlMappingNode yamlMappingNode, ConfigIngressBinding binding)
        {
            foreach (var child in yamlMappingNode !.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "name":
                    binding.Name = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "port":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var port))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    binding.Port = port;
                    break;

                case "ip":
                    if (YamlParser.GetScalarValue(key, child.Value) is string ipString &&
                        (IPAddress.TryParse(ipString, out var ip) || ipString == "*" || ipString.Equals("localhost", StringComparison.OrdinalIgnoreCase)))
                    {
                        binding.IPAddress = ipString;
                    }
                    else
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnIPAddress(key));
                    }
                    break;
Beispiel #8
0
 private static void HandleServiceBindingRoutes(YamlSequenceNode yamlSequenceNode, List <string> routes)
 {
     foreach (var child in yamlSequenceNode !.Children)
     {
         var route = YamlParser.GetScalarValue(child);
         routes.Add(route);
     }
 }
Beispiel #9
0
 private static void HandleServiceTags(YamlSequenceNode yamlSequenceNode, List <string> tags)
 {
     foreach (var child in yamlSequenceNode !.Children)
     {
         var tag = YamlParser.GetScalarValue(child);
         tags.Add(tag);
     }
 }
Beispiel #10
0
        private static void HandleServiceBindingNameMapping(YamlMappingNode yamlMappingNode, ConfigServiceBinding binding)
        {
            foreach (var child in yamlMappingNode.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "name":
                    binding.Name = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "connectionString":
                    binding.ConnectionString = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "port":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var port))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    binding.Port = port;
                    break;

                case "containerPort":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var containerPort))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    binding.ContainerPort = containerPort;
                    break;

                case "host":
                    binding.Host = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "protocol":
                    binding.Protocol = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "routes":
                    if (child.Value.NodeType != YamlNodeType.Sequence)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatExpectedYamlSequence(key));
                    }

                    HandleServiceBindingRoutes((child.Value as YamlSequenceNode) !, binding.Routes);
                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }
        }
Beispiel #11
0
        private static void HandleIngressMapping(YamlMappingNode yamlMappingNode, ConfigIngress configIngress)
        {
            foreach (var child in yamlMappingNode !.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "name":
                    configIngress.Name = YamlParser.GetScalarValue(key, child.Value).ToLowerInvariant();
                    break;

                case "replicas":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var replicas))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    if (replicas < 0)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBePositive(key));
                    }

                    configIngress.Replicas = replicas;
                    break;

                case "rules":
                    if (child.Value.NodeType != YamlNodeType.Sequence)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatExpectedYamlSequence(key));
                    }
                    HandleIngressRules((child.Value as YamlSequenceNode) !, configIngress.Rules);
                    break;

                case "bindings":
                    if (child.Value.NodeType != YamlNodeType.Sequence)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatExpectedYamlSequence(key));
                    }
                    HandleIngressBindings((child.Value as YamlSequenceNode) !, configIngress.Bindings);
                    break;

                case "tags":
                    if (child.Value.NodeType != YamlNodeType.Sequence)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatExpectedYamlSequence(key));
                    }

                    HandleIngressTags((child.Value as YamlSequenceNode) !, configIngress.Tags);
                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }
        }
Beispiel #12
0
        private static void HandleServiceDockerArgsNameMapping(YamlMappingNode yamlMappingNode, IDictionary <string, string> dockerArguments)
        {
            foreach (var child in yamlMappingNode !.Children)
            {
                var key   = YamlParser.GetScalarValue(child.Key);
                var value = YamlParser.GetScalarValue(key, child.Value);

                if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value))
                {
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }

                dockerArguments.Add(key, value);
            }
        }
Beispiel #13
0
        private static void HandleServiceHttpProber(YamlMappingNode yamlMappingNode, ConfigHttpProber prober)
        {
            foreach (var child in yamlMappingNode.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "path":
                    prober.Path = YamlParser.GetScalarValue("path", child.Value);
                    break;

                case "port":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var port))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    prober.Port = port;
                    break;

                case "protocol":
                    prober.Path = YamlParser.GetScalarValue("protocol", child.Value);
                    break;

                case "headers":
                    prober.Headers = new List <KeyValuePair <string, object> >();
                    var headersNode = child.Value as YamlSequenceNode;
                    if (headersNode is null)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatExpectedYamlSequence("headers"));
                    }

                    foreach (var header in headersNode.Children)
                    {
                        HandleServiceProbeHttpHeader((YamlMappingNode)header, prober.Headers);
                    }

                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }
        }
Beispiel #14
0
        private static void HandleServiceConfigurationCompact(YamlScalarNode yamlScalarNode, ConfigConfigurationSource config)
        {
            var nodeValue         = YamlParser.GetScalarValue(yamlScalarNode);
            var keyValueSeparator = nodeValue.IndexOf('=');

            if (keyValueSeparator != -1)
            {
                var key   = nodeValue.Substring(0, keyValueSeparator).Trim();
                var value = nodeValue.Substring(keyValueSeparator + 1)?.Trim();

                config.Name  = key;
                config.Value = value?.Trim(new[] { ' ', '"' }) ?? string.Empty;
            }
            else
            {
                config.Name = nodeValue.Trim();
            }
        }
        public static void HandleConfigApplication(YamlMappingNode yamlMappingNode, ConfigApplication app)
        {
            foreach (var child in yamlMappingNode.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "name":
                    app.Name = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "namespace":
                    app.Namespace = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "network":
                    app.Network = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "registry":
                    app.Registry = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "ingress":
                    YamlParser.ThrowIfNotYamlSequence(key, child.Value);
                    ConfigIngressParser.HandleIngress((child.Value as YamlSequenceNode) !, app.Ingress);
                    break;

                case "services":
                    YamlParser.ThrowIfNotYamlSequence(key, child.Value);
                    ConfigServiceParser.HandleServiceMapping((child.Value as YamlSequenceNode) !, app.Services, app);
                    break;

                case "extensions":
                    YamlParser.ThrowIfNotYamlSequence(key, child.Value);
                    ConfigExtensionsParser.HandleExtensionsMapping((child.Value as YamlSequenceNode) !, app.Extensions);
                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }
        }
Beispiel #16
0
        private static void HandleServiceBuildPropertyNameMapping(YamlMappingNode yamlMappingNode, BuildProperty buildProperty)
        {
            foreach (var child in yamlMappingNode !.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "name":
                    buildProperty.Name = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "value":
                    buildProperty.Value = YamlParser.GetScalarValue(key, child.Value);
                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }
        }
        public static void HandleExtensionsMapping(YamlSequenceNode yamlSequenceNode, List <Dictionary <string, object> > extensions)
        {
            foreach (var child in yamlSequenceNode.Children)
            {
                switch (child.NodeType)
                {
                case YamlNodeType.Mapping:
                    var extensionDictionary = new Dictionary <string, object>();
                    foreach (var mapping in (YamlMappingNode)child)
                    {
                        var key = YamlParser.GetScalarValue(mapping.Key);
                        extensionDictionary[key] = YamlParser.GetScalarValue(key, mapping.Value) !;
                    }

                    extensions.Add(extensionDictionary);
                    break;

                default:
                    throw new TyeYamlException(child.Start,
                                               CoreStrings.FormatUnexpectedType(YamlNodeType.Mapping.ToString(), child.NodeType.ToString()));
                }
            }
        }
Beispiel #18
0
        private static void HandleServiceNameMapping(YamlMappingNode yamlMappingNode, ConfigService service)
        {
            foreach (var child in yamlMappingNode !.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "name":
                    service.Name = YamlParser.GetScalarValue(key, child.Value).ToLowerInvariant();
                    break;

                case "external":
                    if (!bool.TryParse(YamlParser.GetScalarValue(key, child.Value), out var external))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeABoolean(key));
                    }

                    service.External = external;
                    break;

                case "image":
                    service.Image = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "dockerFile":
                    service.DockerFile = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "dockerFileContext":
                    service.DockerFileContext = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "project":
                    service.Project = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "buildProperties":
                    if (child.Value.NodeType != YamlNodeType.Sequence)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatExpectedYamlSequence(key));
                    }

                    HandleBuildProperties((child.Value as YamlSequenceNode) !, service.BuildProperties);
                    break;

                case "include":
                    service.Include = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "repository":
                    service.Repository = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "build":
                    if (!bool.TryParse(YamlParser.GetScalarValue(key, child.Value), out var build))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeABoolean(key));
                    }

                    service.Build = build;
                    break;

                case "executable":
                    service.Executable = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "workingDirectory":
                    service.WorkingDirectory = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "args":
                    service.Args = YamlParser.GetScalarValue(key, child.Value);
                    break;

                case "replicas":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var replicas))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    if (replicas < 0)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBePositive(key));
                    }

                    service.Replicas = replicas;
                    break;

                case "bindings":
                    if (child.Value.NodeType != YamlNodeType.Sequence)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatExpectedYamlSequence(key));
                    }

                    HandleServiceBindings((child.Value as YamlSequenceNode) !, service.Bindings);
                    break;

                case "volumes":
                    if (child.Value.NodeType != YamlNodeType.Sequence)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatExpectedYamlSequence(key));
                    }

                    HandleServiceVolumes((child.Value as YamlSequenceNode) !, service.Volumes);
                    break;

                case "env":
                case "configuration":
                    if (child.Value.NodeType != YamlNodeType.Sequence)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatExpectedYamlSequence(key));
                    }

                    HandleServiceConfiguration((child.Value as YamlSequenceNode) !, service.Configuration);
                    break;

                case "liveness":
                    service.Liveness = new ConfigProbe();
                    HandleServiceProbe((YamlMappingNode)child.Value, service.Liveness !);
                    break;

                case "readiness":
                    service.Readiness = new ConfigProbe();
                    HandleServiceProbe((YamlMappingNode)child.Value, service.Readiness !);
                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }
        }
Beispiel #19
0
        private static void HandleServiceProbe(YamlMappingNode yamlMappingNode, ConfigProbe probe)
        {
            foreach (var child in yamlMappingNode.Children)
            {
                var key = YamlParser.GetScalarValue(child.Key);

                switch (key)
                {
                case "http":
                    probe.Http = new ConfigHttpProber();
                    HandleServiceHttpProber((YamlMappingNode)child.Value, probe.Http !);
                    break;

                case "initialDelay":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var initialDelay))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    if (initialDelay < 0)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBePositive(key));
                    }

                    probe.InitialDelay = initialDelay;
                    break;

                case "period":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var period))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    if (period < 1)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeGreaterThanZero(key));
                    }

                    probe.Period = period;
                    break;

                case "timeout":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var timeout))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    if (timeout < 1)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeGreaterThanZero(key));
                    }

                    probe.Timeout = timeout;
                    break;

                case "successThreshold":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var successThreshold))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    if (successThreshold < 1)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeGreaterThanZero(key));
                    }

                    probe.SuccessThreshold = successThreshold;
                    break;

                case "failureThreshold":
                    if (!int.TryParse(YamlParser.GetScalarValue(key, child.Value), out var failureThreshold))
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeAnInteger(key));
                    }

                    if (failureThreshold < 1)
                    {
                        throw new TyeYamlException(child.Value.Start, CoreStrings.FormatMustBeGreaterThanZero(key));
                    }

                    probe.FailureThreshold = failureThreshold;
                    break;

                default:
                    throw new TyeYamlException(child.Key.Start, CoreStrings.FormatUnrecognizedKey(key));
                }
            }
        }
Beispiel #20
0
        private static void HandleServiceEnvFiles(YamlSequenceNode yamlSequenceNode, List <ConfigConfigurationSource> configuration, ConfigApplication application)
        {
            foreach (var child in yamlSequenceNode.Children)
            {
                switch (child)
                {
                case YamlScalarNode childScalarNode:
                    var envFile = new FileInfo(Path.Combine(application.Source?.DirectoryName ?? Directory.GetCurrentDirectory(), YamlParser.GetScalarValue(childScalarNode)));
                    if (!envFile.Exists)
                    {
                        throw new TyeYamlException(child.Start, CoreStrings.FormatPathNotFound(envFile.FullName));
                    }
                    HandleServiceEnvFile(childScalarNode, File.ReadAllLines(envFile.FullName), configuration);
                    break;

                default:
                    throw new TyeYamlException(child.Start, CoreStrings.FormatUnexpectedType(YamlNodeType.Scalar.ToString(), child.NodeType.ToString()));
                }
            }
        }