public static bool TryParse(string value, out ValidExternalVideoUrl externalVideoUrl, out IReadOnlyCollection <string> errorMessages)
        {
            var errorMessageList = new List <string>();

            errorMessages = errorMessageList;

            if (IsEmpty(value))
            {
                // TryParse should never fail, so report null as an error instead of ArgumentNullException.
                errorMessageList.Add("Value required");
            }
            else
            {
                Uri uri;
                if (!Uri.TryCreate(value, UriKind.Absolute, out uri))
                {
                    errorMessageList.Add("Must be valid URL");
                }
                else
                {
                    value = uri.ToString();

                    if (value.Length < MinLength || value.Length > MaxLength)
                    {
                        errorMessageList.Add(string.Format("Length must be from {0} to {1} characters", MinLength, MaxLength));
                    }

                    if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps)
                    {
                        errorMessageList.Add("Must be HTTP(S)");
                    }

                    if (!AllowedDomains.Contains(uri.Host))
                    {
                        errorMessageList.Add("Must be from " + AllowedDomainsMessage);
                    }
                }
            }

            if (errorMessageList.Count > 0)
            {
                externalVideoUrl = null;
                return(false);
            }

            externalVideoUrl = new ValidExternalVideoUrl(value);

            return(true);
        }
        public static bool TryParse(string value, out ValidExternalVideoUrl externalVideoUrl)
        {
            IReadOnlyCollection <string> errorMessages;

            return(TryParse(value, out externalVideoUrl, out errorMessages));
        }