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
//! Responses for the /instances/* endpoints

use crate::Resp;

#[derive(Debug, Deserialize)]
/// Represents the response you get from the instances/sample request
pub struct SampleResponse {
    /// list of instances in the sample
    pub instances: Vec<Instance>,
}

impl Resp for SampleResponse {
    type Item = Instance;

    fn items(&self) -> &Vec<Self::Item> {
        &self.instances
    }

    fn next(&self) -> Option<String> {
        None
    }
}

#[derive(Debug, Deserialize)]
/// Represents the response you get from the instances/sample request
pub struct ListResponse {
    /// the returned list of instances
    pub instances: Vec<Instance>,
    /// pagination data
    pub pagination: Pagination,
}

impl Resp for ListResponse {
    type Item = Instance;

    fn items(&self) -> &Vec<Self::Item> {
        &self.instances
    }

    fn next(&self) -> Option<String> {
        self.pagination.next_id.clone()
    }
}

#[derive(Debug, Deserialize)]
/// Pagination data
pub struct Pagination {
    /// the total number of results for this query
    pub total: u64,
    /// the id to use to get the next page of results for this query
    pub next_id: Option<String>,
}

#[derive(Debug, Deserialize)]
/// Response from the instances/search request
pub struct SearchResponse {
    /// the returned list of instances
    pub instances: Vec<Instance>,
    /// pgaination data
    pub pagination: Pagination,
}

impl Resp for SearchResponse {
    type Item = Instance;

    fn items(&self) -> &Vec<Self::Item> {
        &self.instances
    }

    fn next(&self) -> Option<String> {
        self.pagination.next_id.clone()
    }
}

#[derive(Clone, Debug, Deserialize)]
/// Represents an instance in the sample response
pub struct Instance {
    /// id
    pub id: String,
    /// name
    pub name: String,
    /// added at
    pub added_at: Option<String>,   // TODO: datetime
    /// updated at
    pub updated_at: Option<String>, // TODO: datetime
    /// checked at
    pub checked_at: Option<String>, // TODO: datetime
    /// uptime
    pub uptime: i64,
    /// up
    pub up: bool,
    /// dead
    pub dead: bool,
    /// version
    pub version: Option<String>,
    /// ipv6
    pub ipv6: bool,
    /// https score
    pub https_score: Option<i64>,
    /// https rank
    pub https_rank: Option<String>,
    /// obs score
    pub obs_score: Option<i64>,
    /// users
    pub users: String,
    /// statuses
    pub statuses: String,
    /// connections
    pub connections: String,
    /// open registrations
    pub open_registrations: bool,
    /// info
    pub info: Option<InstanceInfo>,
    /// thumbnail
    pub thumbnail: Option<String>,
    /// thumbnail proxy
    pub thumbnail_proxy: Option<String>,
    /// active users
    pub active_users: Option<i64>,
}

#[derive(Clone, Debug, Deserialize)]
/// Instance Info
pub struct InstanceInfo {
    /// short description
    pub short_description: Option<String>,
    /// full description
    pub full_description: Option<String>,
    /// topic
    pub topic: Option<String>,
    /// languages
    pub languages: Option<Vec<String>>,
    /// other languages accepted
    pub other_languages_accepted: Option<bool>,
    /// federates with
    pub federates_with: Option<String>,
    /// prohibited content
    pub prohibited_content: Option<Vec<String>>,
    /// categories
    pub categories: Option<Vec<String>>,
}