OSDN Git Service

e7b9e57f2f1163091bab6b91196abf4e133fd309
[opentween/open-tween.git] / OpenTween / Api / DataModel / TwitterPageable.cs
1 // OpenTween - Client of Twitter
2 // Copyright (c) 2014 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
3 // All rights reserved.
4 //
5 // This file is part of OpenTween.
6 //
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)
10 // any later version.
11 //
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
15 // for more details.
16 //
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.
21
22 #nullable enable annotations
23
24 using System;
25 using System.Collections.Generic;
26 using System.Linq;
27 using System.Runtime.Serialization;
28 using System.Text;
29 using System.Threading.Tasks;
30
31 namespace OpenTween.Api.DataModel
32 {
33     [DataContract]
34     public abstract class TwitterPageable<T>
35     {
36         public abstract T[] Items { get; }
37
38         [DataMember(Name = "next_cursor")]
39         public long NextCursor { get; set; }
40
41         [DataMember(Name = "next_cursor_str")]
42         public string NextCursorStr { get; set; }
43
44         [DataMember(Name = "previous_cursor")]
45         public long PreviousCursor { get; set; }
46
47         [DataMember(Name = "previous_cursor_str")]
48         public string PreviousCursorStr { get; set; }
49
50         /// <summary>
51         /// cursorを引数に持つメソッドを使用してアイテムを全件取得します
52         /// </summary>
53         public static async Task<IEnumerable<T>> GetAllItemsAsync<TResult>(Func<long, Task<TResult>> pageMethod)
54             where TResult : TwitterPageable<T>
55         {
56             var results = Enumerable.Empty<T>();
57
58             var cursor = -1L;
59             do
60             {
61                 var page = await pageMethod(cursor).ConfigureAwait(false);
62                 results = results.Concat(page.Items);
63                 cursor = page.NextCursor;
64             }
65             while (cursor != 0L);
66
67             return results;
68         }
69     }
70
71     [DataContract]
72     public class TwitterIds : TwitterPageable<long>
73     {
74         [DataMember(Name = "ids")]
75         public long[] Ids { get; set; }
76
77         [IgnoreDataMember]
78         public override long[] Items
79             => this.Ids;
80
81         /// <exception cref="SerializationException"/>
82         public static TwitterIds ParseJson(string json)
83             => MyCommon.CreateDataFromJson<TwitterIds>(json);
84     }
85
86     [DataContract]
87     public class TwitterUsers : TwitterPageable<TwitterUser>
88     {
89         [DataMember(Name = "users")]
90         public TwitterUser[] Users { get; set; }
91
92         [IgnoreDataMember]
93         public override TwitterUser[] Items
94             => this.Users;
95
96         /// <exception cref="SerializationException"/>
97         public static TwitterUsers ParseJson(string json)
98             => MyCommon.CreateDataFromJson<TwitterUsers>(json);
99     }
100
101     [DataContract]
102     public class TwitterLists : TwitterPageable<TwitterList>
103     {
104         [DataMember(Name = "lists")]
105         public TwitterList[] Lists { get; set; }
106
107         [IgnoreDataMember]
108         public override TwitterList[] Items
109             => this.Lists;
110
111         /// <exception cref="SerializationException"/>
112         public static TwitterLists ParseJson(string json)
113             => MyCommon.CreateDataFromJson<TwitterLists>(json);
114     }
115 }