/// <summary>
 /// Converts the string representation of the sort options. A return value indicates
 /// whether the conversion succeeded.
 /// </summary>
 /// <param name="str">A string containing the sort options to convert.</param>
 /// <param name="options">The converted options if successful.</param>
 /// <returns><var>true</var> if str was converted successfully; otherwise, <var>false</var>.</returns>
 public static bool TryParse(string str, out AnalyticsSortOptions options)
 {
     try {
         options = Parse(str);
         return(true);
     } catch {
         options = null;
         return(false);
     }
 }
        /// <summary>
        /// Converts the string representation of the sort options.
        /// </summary>
        /// <param name="str">A string containing the sort options to convert.</param>
        /// <returns>The converted sort options.</returns>
        public static AnalyticsSortOptions Parse(string str)
        {
            // If the strign is NULL, we also return NULL
            if (str == null)
            {
                return(null);
            }

            AnalyticsSortOptions options = new AnalyticsSortOptions();

            // The sort fields are separated by commas
            string[] b = str.Split(new [] { "," }, StringSplitOptions.RemoveEmptyEntries);

            for (int j = 0; j < b.Length; j++)
            {
                string piece = b[j];

                AnalyticsSortOrder order = AnalyticsSortOrder.Ascending;
                if (piece.StartsWith("-"))
                {
                    order = AnalyticsSortOrder.Descending;
                    piece = piece.Substring(1);
                }

                // Does the piece have the characteristics of a metric or dimension?
                Match m = Regex.Match(piece, "^(ga:[a-zA-Z]+)$");
                if (!m.Success)
                {
                    throw new Exception("Unable to parse metric or dimension '" + piece + "'");
                }

                AnalyticsMetric    metric;
                AnalyticsDimension dimension;
                if (AnalyticsMetric.TryParse(m.Groups[1].Value, out metric))
                {
                    options.Add(metric, order);
                }
                else if (AnalyticsDimension.TryParse(m.Groups[1].Value, out dimension))
                {
                    options.Add(dimension, order);
                }
                else
                {
                    // Currently the parsing will only work if the specified dimension or
                    // metric name matches a defined constant, so if Google adds a new
                    // dimension or metric, the constants must be updated before the parsing
                    // will work. I'm not sure how often Google adds new dimensions or metric,
                    // so perhaps this isn't a problem
                    throw new Exception("Unable to parse metric or dimension '" + m.Groups[1].Value + "'");
                }
            }

            return(options);
        }
        /// <summary>
        /// Converts the string representation of the sort options.
        /// </summary>
        /// <param name="str">A string containing the sort options to convert.</param>
        /// <returns>The converted sort options.</returns>
        public static AnalyticsSortOptions Parse(string str) {

            // If the strign is NULL, we also return NULL
            if (str == null) return null;

            AnalyticsSortOptions options = new AnalyticsSortOptions();

            // The sort fields are separated by commas
            string[] b = str.Split(new [] {","}, StringSplitOptions.RemoveEmptyEntries);

            for (int j = 0; j < b.Length; j++) {

                string piece = b[j];

                AnalyticsSortOrder order = AnalyticsSortOrder.Ascending;
                if (piece.StartsWith("-")) {
                    order = AnalyticsSortOrder.Descending;
                    piece = piece.Substring(1);
                }

                // Does the piece have the characteristics of a metric or dimension?
                Match m = Regex.Match(piece, "^(ga:[a-zA-Z]+)$");
                if (!m.Success) throw new Exception("Unable to parse metric or dimension '" + piece + "'");

                AnalyticsMetric metric;
                AnalyticsDimension dimension;
                if (AnalyticsMetric.TryParse(m.Groups[1].Value, out metric)) {
                    options.Add(metric, order);
                } else if (AnalyticsDimension.TryParse(m.Groups[1].Value, out dimension)) {
                    options.Add(dimension, order);
                } else {
                    // Currently the parsing will only work if the specified dimension or
                    // metric name matches a defined constant, so if Google adds a new
                    // dimension or metric, the constants must be updated before the parsing
                    // will work. I'm not sure how often Google adds new dimensions or metric,
                    // so perhaps this isn't a problem
                    throw new Exception("Unable to parse metric or dimension '" + m.Groups[1].Value + "'");
                }

            }

            return options;

        }
 /// <summary>
 /// Converts the string representation of the sort options. A return value indicates
 /// whether the conversion succeeded.
 /// </summary>
 /// <param name="str">A string containing the sort options to convert.</param>
 /// <param name="options">The converted options if successful.</param>
 /// <returns><var>true</var> if str was converted successfully; otherwise, <var>false</var>.</returns>
 public static bool TryParse(string str, out AnalyticsSortOptions options) {
     try {
         options = Parse(str);
         return true;
     } catch {
         options = null;
         return false;
     }
 }