use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct MeResponse {
pub authenticated: bool,
pub auth_type: String,
pub identity: Option<String>,
pub permission_level: String,
pub rate_limit: Option<MeRateLimit>,
pub token_limits: MeTokenLimits,
pub server_version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct MeRateLimit {
pub tier: String,
pub limit: u32,
pub remaining: u32,
pub reset_secs: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct MeTokenLimits {
pub tier: String,
pub hourly: MeTokenWindow,
pub daily: MeTokenWindow,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct MeTokenWindow {
pub limit: u64,
pub remaining: u64,
pub reset_at_secs: i64,
}
#[cfg(test)]
mod tests {
use super::*;
fn sample() -> MeResponse {
MeResponse {
authenticated: true,
auth_type: "read_uplift".to_owned(),
identity: Some("octocat".to_owned()),
permission_level: "read".to_owned(),
rate_limit: Some(MeRateLimit {
tier: "read_uplift".to_owned(),
limit: 120,
remaining: 87,
reset_secs: 31,
}),
token_limits: MeTokenLimits {
tier: "read_uplift".to_owned(),
hourly: MeTokenWindow {
limit: 200_000,
remaining: 150_000,
reset_at_secs: 1_200,
},
daily: MeTokenWindow {
limit: 2_000_000,
remaining: 1_900_000,
reset_at_secs: 50_000,
},
},
server_version: "0.4.2".to_owned(),
}
}
#[test]
fn round_trips_through_json() {
let me = sample();
let json = serde_json::to_value(&me).expect("serialize");
let back: MeResponse = serde_json::from_value(json).expect("deserialize");
assert_eq!(me, back);
}
#[test]
fn disabled_rate_limit_serializes_as_null_and_round_trips() {
let mut me = sample();
me.rate_limit = None;
let json = serde_json::to_value(&me).expect("serialize");
assert!(json["rate_limit"].is_null(), "disabled limiter must emit null, not absent");
let back: MeResponse = serde_json::from_value(json).expect("deserialize");
assert_eq!(me, back);
}
}