public bool TryResolve(IEnumerable <KeyValuePair <string, string> > values, out IAbsoluteDirectoryPath resolvedDirectoryPath,
                                   out string failureMessage)
            {
                Debug.Assert(values != null);
                IReadOnlyList <string> unresolvedVariables;
                var status = TryResolve(values, out resolvedDirectoryPath, out unresolvedVariables);

                switch (status)
                {
                default:
                    Debug.Assert(status == VariablePathResolvingStatus.Success);
                    failureMessage = null;
                    return(true);

                case VariablePathResolvingStatus.ErrorUnresolvedVariable:
                    Debug.Assert(unresolvedVariables != null);
                    Debug.Assert(unresolvedVariables.Count > 0);
                    failureMessage = VariablePathHelpers.GetUnresolvedVariableFailureReason(unresolvedVariables);
                    return(false);

                case VariablePathResolvingStatus.ErrorVariableResolvedButCannotConvertToAbsolutePath:
                    failureMessage = GetVariableResolvedButCannotConvertToAbsolutePathFailureReason(values, "directory");
                    return(false);
                }
            }
            public bool TryResolve(IEnumerable <KeyValuePair <string, string> > variables, out IAbsoluteFilePath resolvedPath, out string failureMessage)
            {
                Argument.IsNotNull(nameof(variables), variables);

                IReadOnlyList <string> unresolvedVariables;

                var variablesList = variables as IList <KeyValuePair <string, string> > ?? variables.ToList();
                var status        = TryResolve(variablesList, out resolvedPath, out unresolvedVariables);

                switch (status)
                {
                default:
                    //Debug.Assert(status == VariablePathResolvingStatus.Success);

                    failureMessage = null;

                    return(true);

                case VariablePathResolvingStatus.UnresolvedVariable:
                    //Debug.Assert(unresolvedVariables != null);
                    //Debug.Assert(unresolvedVariables.Count > 0);

                    failureMessage = VariablePathHelpers.GetUnresolvedVariableFailureReason(unresolvedVariables);

                    return(false);

                case VariablePathResolvingStatus.CannotConvertToAbsolutePath:
                    failureMessage = GetVariableResolvedButCannotConvertToAbsolutePathFailureReason(variablesList, "file");

                    return(false);
                }
            }