1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
use crate::api_parameters::ApiParameters;
use crate::category::Category;
use crate::format::Format;
use crate::limit::Limit;
use crate::sort_by::SortBy;

#[derive(Clone, Debug)]
pub struct ApiParametersBuilder {
    ranked: bool,
    limit: Limit,
    categories: Option<Vec<Category>>,
    sort_by: SortBy,
    minimum_seeders: Option<u32>,
    minimum_leechers: Option<u32>,
    format: Format,
}

impl ApiParametersBuilder {
    /// Ranked torrents are scene releases + rarbg releases + rartv releases.
    ///
    /// If ranked is false, the API will show all the torrents.
    ///
    /// # Example
    /// ```
    /// use rarbg_api::api_parameters_builder::ApiParametersBuilder;
    ///
    /// let apb = ApiParametersBuilder::new().ranked(false);
    /// ```
    pub fn ranked(&mut self, ranked: bool) -> &mut ApiParametersBuilder {
        self.ranked = ranked;
        self
    }

    /// You can limit the number of torrents to list or search by 25, 50 or 100.
    ///
    /// # Example
    /// ```
    /// use rarbg_api::api_parameters_builder::ApiParametersBuilder;
    /// use rarbg_api::limit::Limit;
    ///
    /// let apb = ApiParametersBuilder::new().limit(Limit::OneHundred);
    /// ```
    pub fn limit(&mut self, limit: Limit) -> &mut ApiParametersBuilder {
        self.limit = limit;
        self
    }

    /// You can filter torrents by categories.
    ///
    /// # Example
    /// ```
    /// use rarbg_api::api_parameters_builder::ApiParametersBuilder;
    /// use rarbg_api::category::Category;
    ///
    /// let apb = ApiParametersBuilder::new().categories(vec![Category::TvHdEpisodes, Category::TvUhdEpisodes]);
    /// ```
    pub fn categories(&mut self, categories: Vec<Category>) -> &mut ApiParametersBuilder {
        self.categories = Some(categories);
        self
    }

    /// You can sort torrents by seeders, leechers or last uploaded.
    ///
    /// # Example
    /// ```
    /// use rarbg_api::api_parameters_builder::ApiParametersBuilder;
    /// use rarbg_api::sort_by::SortBy;
    ///
    /// let apb = ApiParametersBuilder::new().sort_by(SortBy::Seeders);
    /// ```
    pub fn sort_by(&mut self, sort_by: SortBy) -> &mut ApiParametersBuilder {
        self.sort_by = sort_by;
        self
    }

    /// You can specify the minimum number of seeders that a torrent must have.
    ///
    /// # Example
    /// ```
    /// use rarbg_api::api_parameters_builder::ApiParametersBuilder;
    ///
    /// let apb = ApiParametersBuilder::new().minimum_seeders(42);
    /// ```
    pub fn minimum_seeders(&mut self, minimum_seeders: u32) -> &mut ApiParametersBuilder {
        self.minimum_seeders = Some(minimum_seeders);
        self
    }

    /// You can specify the minimum number of leechers that a torrent must have.
    ///
    /// # Example
    /// ```
    /// use rarbg_api::api_parameters_builder::ApiParametersBuilder;
    ///
    /// let apb = ApiParametersBuilder::new().minimum_leechers(42);
    /// ```
    pub fn minimum_leechers(&mut self, minimum_leechers: u32) -> &mut ApiParametersBuilder {
        self.minimum_leechers = Some(minimum_leechers);
        self
    }

    /// You can choose the format of the response in order to have less or more details on each torrent.
    ///
    /// # Example
    /// ```
    /// use rarbg_api::api_parameters_builder::ApiParametersBuilder;
    /// use rarbg_api::format::Format;
    ///
    /// let apb = ApiParametersBuilder::new().format(Format::JsonExtended);
    /// ```
    pub fn format(&mut self, format: Format) -> &mut ApiParametersBuilder {
        self.format = format;
        self
    }

    /// Create a new ApiParametersBuilder with default options.
    ///
    /// Default options are :
    /// * Only ranked torrents
    /// * Limit torrents to 25
    /// * No categories filtering
    /// * Sorted by last uploaded
    /// * No minimum seeders/leechers
    /// * Json format
    pub fn new() -> Self {
        ApiParametersBuilder {
            ranked: true,
            limit: Limit::default(),
            categories: None,
            sort_by: SortBy::default(),
            minimum_seeders: None,
            minimum_leechers: None,
            format: Format::default(),
        }
    }

    /// Construct an immutable ApiParameters that can be use with RarBgApi.
    ///
    /// # Example
    /// ```
    /// use rarbg_api::api_parameters_builder::ApiParametersBuilder;
    /// use rarbg_api::api_parameters::ApiParameters;
    /// use rarbg_api::limit::Limit;
    /// use rarbg_api::sort_by::SortBy;
    /// use rarbg_api::format::Format;
    /// use rarbg_api::category::Category;
    ///
    /// let ap :ApiParameters = ApiParametersBuilder::new()
    ///                          .ranked(false)
    ///                          .limit(Limit::OneHundred)
    ///                          .categories(vec![Category::TvHdEpisodes, Category::TvUhdEpisodes])
    ///                          .sort_by(SortBy::Seeders)
    ///                          .minimum_seeders(42)
    ///                          .minimum_leechers(42)
    ///                          .format(Format::JsonExtended)
    ///                          .build();
    /// ```
    pub fn build(&self) -> ApiParameters {
        ApiParameters {
            ranked: self.ranked,
            limit: self.limit,
            categories: self.categories.clone(),
            sort_by: self.sort_by,
            minimum_seeders: self.minimum_seeders,
            minimum_leechers: self.minimum_leechers,
            format: self.format,
        }
    }
}