1 // OpenTween - Client of Twitter
2 // Copyright (c) 2014 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
3 // All rights reserved.
5 // This file is part of OpenTween.
7 // This program is free software; you can redistribute it and/or modify it
8 // under the terms of the GNU General Public License as published by the Free
9 // Software Foundation; either version 3 of the License, or (at your option)
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 // You should have received a copy of the GNU General Public License along
18 // with this program. If not, see <http://www.gnu.org/licenses/>, or write to
19 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20 // Boston, MA 02110-1301, USA.
22 #nullable enable annotations
25 using System.Collections.Generic;
27 using System.Runtime.Serialization;
29 using System.Threading.Tasks;
31 namespace OpenTween.Api.DataModel
34 public abstract class TwitterPageable<T>
36 public abstract T[] Items { get; }
38 [DataMember(Name = "next_cursor")]
39 public long NextCursor { get; set; }
41 [DataMember(Name = "next_cursor_str")]
42 public string NextCursorStr { get; set; }
44 [DataMember(Name = "previous_cursor")]
45 public long PreviousCursor { get; set; }
47 [DataMember(Name = "previous_cursor_str")]
48 public string PreviousCursorStr { get; set; }
51 /// cursorを引数に持つメソッドを使用してアイテムを全件取得します
53 public static async Task<IEnumerable<T>> GetAllItemsAsync<TResult>(Func<long, Task<TResult>> pageMethod)
54 where TResult : TwitterPageable<T>
56 var results = Enumerable.Empty<T>();
61 var page = await pageMethod(cursor).ConfigureAwait(false);
62 results = results.Concat(page.Items);
63 cursor = page.NextCursor;
72 public class TwitterIds : TwitterPageable<long>
74 [DataMember(Name = "ids")]
75 public long[] Ids { get; set; }
78 public override long[] Items
81 /// <exception cref="SerializationException"/>
82 public static TwitterIds ParseJson(string json)
83 => MyCommon.CreateDataFromJson<TwitterIds>(json);
87 public class TwitterUsers : TwitterPageable<TwitterUser>
89 [DataMember(Name = "users")]
90 public TwitterUser[] Users { get; set; }
93 public override TwitterUser[] Items
96 /// <exception cref="SerializationException"/>
97 public static TwitterUsers ParseJson(string json)
98 => MyCommon.CreateDataFromJson<TwitterUsers>(json);
102 public class TwitterLists : TwitterPageable<TwitterList>
104 [DataMember(Name = "lists")]
105 public TwitterList[] Lists { get; set; }
108 public override TwitterList[] Items
111 /// <exception cref="SerializationException"/>
112 public static TwitterLists ParseJson(string json)
113 => MyCommon.CreateDataFromJson<TwitterLists>(json);