View Javadoc
1   /**
2    * Copyright (c) 2013-2023, jcabi.com
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met: 1) Redistributions of source code must retain the above
8    * copyright notice, this list of conditions and the following
9    * disclaimer. 2) Redistributions in binary form must reproduce the above
10   * copyright notice, this list of conditions and the following
11   * disclaimer in the documentation and/or other materials provided
12   * with the distribution. 3) Neither the name of the jcabi.com nor
13   * the names of its contributors may be used to endorse or promote
14   * products derived from this software without specific prior written
15   * permission.
16   *
17   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
19   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21   * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28   * OF THE POSSIBILITY OF SUCH DAMAGE.
29   */
30  package com.jcabi.github;
31  
32  import com.jcabi.aspects.Immutable;
33  import com.jcabi.aspects.Loggable;
34  import lombok.EqualsAndHashCode;
35  import lombok.ToString;
36  
37  /**
38   * Github Rate Limit API.
39   *
40   * @author Yegor Bugayenko (yegor256@gmail.com)
41   * @version $Id: ce4dd864b056e0b698f62f223c998eb4ed155547 $
42   * @since 0.6
43   * @see <a href="https://developer.github.com/v3/rate_limit/">Rate Limit API</a>
44   */
45  @Immutable
46  public interface Limits {
47  
48      /**
49       * Resource name.
50       */
51      String CORE = "core";
52  
53      /**
54       * Resource name.
55       */
56      String SEARCH = "search";
57  
58      /**
59       * Github we're in.
60       * @return Github
61       */
62      Github github();
63  
64      /**
65       * Get limit for the given resource.
66       * @param resource Name of resource
67       * @return Limit
68       */
69      Limit get(String resource);
70  
71      /**
72       * Throttled Limits.
73       * @since 0.6
74       */
75      @Immutable
76      @ToString
77      @Loggable(Loggable.DEBUG)
78      @EqualsAndHashCode(of = "origin")
79      final class Throttled implements Limits {
80          /**
81           * Original.
82           */
83          private final transient Limits origin;
84          /**
85           * Maximum allowed, instead of default 5000.
86           */
87          private final transient int max;
88          /**
89           * Public ctor.
90           * @param limits Original limits
91           * @param allowed Maximum allowed
92           */
93          public Throttled(
94              final Limits limits,
95              final int allowed
96          ) {
97              this.origin = limits;
98              this.max = allowed;
99          }
100         @Override
101         public Github github() {
102             return this.origin.github();
103         }
104         @Override
105         public Limit get(
106             final String resource
107         ) {
108             return new Limit.Throttled(this.origin.get(resource), this.max);
109         }
110     }
111 
112 }