/// <summary>
        /// Retrieve user timeline data with specific parser.
        /// </summary>
        /// <typeparam name="TSchema">Strong type for results.</typeparam>
        /// <param name="screenName">User screen name.</param>
        /// <param name="maxRecords">Upper record limit.</param>
        /// <param name="parser">Specific results parser.</param>
        /// <returns>Returns strongly typed list of results.</returns>
        public async Task <IEnumerable <TSchema> > GetUserTimeLineAsync <TSchema>(string screenName, int maxRecords, Toolkit.Parsers.IParser <TSchema> parser)
            where TSchema : Toolkit.Parsers.SchemaBase
        {
            string rawResult = null;

            try
            {
                var uri = new Uri($"{BaseUrl}/statuses/user_timeline.json?screen_name={OAuthEncoder.UrlEncode(screenName)}&count={maxRecords}");

                WeiboOAuthRequest request = new WeiboOAuthRequest();
                rawResult = await request.ExecuteGetAsync(uri, _tokens);

                var result = parser.Parse(rawResult);
                return(result
                       .Take(maxRecords)
                       .ToList());
            }
            catch (UserNotFoundException)
            {
                throw new UserNotFoundException(screenName);
            }
            catch
            {
                if (!string.IsNullOrEmpty(rawResult))
                {
                    var errors = JsonConvert.DeserializeObject <WeiboError>(rawResult);

                    throw new WeiboException {
                              Error = errors
                    };
                }

                throw;
            }
        }
        /// <summary>
        /// Get home time line data.
        /// </summary>
        /// <typeparam name="TSchema">Strong typed result.</typeparam>
        /// <param name="maxRecords">Upper record limit.</param>
        /// <param name="parser">Specific result parser.</param>
        /// <returns>Return strong typed list of results.</returns>
        private async Task <IEnumerable <TSchema> > GetHomeTimeLineAsync <TSchema>(int maxRecords, Toolkit.Parsers.IParser <TSchema> parser)
            where TSchema : Toolkit.Parsers.SchemaBase
        {
            var uri = new Uri($"{BaseUrl}/statuses/home_timeline.json?count={maxRecords}");

            WeiboOAuthRequest request = new WeiboOAuthRequest();
            var rawResult             = await request.ExecuteGetAsync(uri, _tokens);

            return(parser.Parse(rawResult));
        }
        /// <summary>
        /// Retrieve user data.
        /// </summary>
        /// <param name="screenName">User screen name or null for current logged user</param>
        /// <returns>Returns user data.</returns>
        public async Task <WeiboUser> GetUserAsync(string screenName = null)
        {
            string rawResult = null;

            try
            {
                Uri uri;
                if (screenName == null)
                {
                    uri = new Uri($"{BaseUrl}/users/show.json?uid={Uid}");
                }
                else
                {
                    uri = new Uri($"{BaseUrl}/users/show.json?screen_name={OAuthEncoder.UrlEncode(screenName)}");
                }

                WeiboOAuthRequest request = new WeiboOAuthRequest();
                rawResult = await request.ExecuteGetAsync(uri, _tokens);

                return(JsonConvert.DeserializeObject <WeiboUser>(rawResult));
            }
            catch (UserNotFoundException)
            {
                throw new UserNotFoundException(screenName);
            }
            catch
            {
                if (!string.IsNullOrEmpty(rawResult))
                {
                    var error = JsonConvert.DeserializeObject <WeiboError>(rawResult);

                    throw new WeiboException {
                              Error = error
                    };
                }

                throw;
            }
        }
        /// <summary>
        /// Posts a status update.
        /// </summary>
        /// <param name="status">Status text.</param>
        /// <param name="picture">Picture to attach to the status.</param>
        /// <returns>Success or failure.</returns>
        public async Task <WeiboStatus> PostStatusAsync(string status, Stream picture = null)
        {
            var uri = new Uri($"{BaseUrl}/statuses/share.json");

            WeiboOAuthRequest request = new WeiboOAuthRequest();

            if (picture == null)
            {
                return(await request.ExecutePostAsync(uri, _tokens, status));
            }
            else
            {
                byte[] fileBytes;

                using (var ms = new MemoryStream())
                {
                    await picture.CopyToAsync(ms);

                    fileBytes = ms.ToArray();
                }

                return(await request.ExecutePostMultipartAsync(uri, _tokens, status, fileBytes));
            }
        }