use chrono::DateTime;
use github_auth::{Authenticator, Scope};
use serde::{Deserialize, Serialize};
use structopt::StructOpt;
use surf::http::headers::AUTHORIZATION;
#[derive(structopt::StructOpt)]
struct Opts {
user_name: String,
repo_name: String,
}
#[async_std::main]
async fn main() -> surf::Result<()> {
let opts = Opts::from_args();
let token_name = format!(
"{} on {} ({})",
env!("CARGO_PKG_NAME"),
whoami::hostname(),
whoami::distro()
);
let auth = Authenticator::builder(token_name)
.scope(Scope::PublicRepo)
.build();
let token = auth.auth().await?;
let mut res = surf::get(format!(
"https://api.github.com/repos/{}/{}/releases",
opts.user_name, opts.repo_name
))
.header(AUTHORIZATION, format!("token {}", token))
.await?;
let releases: Vec<Release> = res.body_json().await?;
let latest = releases.first().expect("no releases found");
let when = DateTime::parse_from_rfc3339(&latest.published_at)?;
let mut res = surf::get(format!(
"https://api.github.com/repos/{}/{}/pulls?state=closed",
opts.user_name, opts.repo_name
))
.header(AUTHORIZATION, format!("token {}", token))
.await?;
let pulls: Vec<Pull> = res.body_json().await?;
let pulls: Vec<String> = pulls
.into_iter()
.filter(|pull| {
let merged_at = match pull.merged_at.as_str() {
Some(val) => val,
None => return false,
};
let merged = match DateTime::parse_from_rfc3339(merged_at) {
Err(_) => return false,
Ok(v) => v,
};
merged > when
})
.map(|pull| format!("- {} #{}", pull.title, pull.number))
.collect();
println!("{}", pulls.join("\n"));
Ok(())
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Release {
pub url: String,
#[serde(rename = "assets_url")]
pub assets_url: String,
#[serde(rename = "upload_url")]
pub upload_url: String,
#[serde(rename = "html_url")]
pub html_url: String,
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
#[serde(rename = "tag_name")]
pub tag_name: String,
#[serde(rename = "target_commitish")]
pub target_commitish: String,
pub name: String,
pub draft: bool,
pub author: Author,
pub prerelease: bool,
#[serde(rename = "created_at")]
pub created_at: String,
#[serde(rename = "published_at")]
pub published_at: String,
pub assets: Vec<::serde_json::Value>,
#[serde(rename = "tarball_url")]
pub tarball_url: String,
#[serde(rename = "zipball_url")]
pub zipball_url: String,
pub body: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Author {
pub login: String,
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
#[serde(rename = "avatar_url")]
pub avatar_url: String,
#[serde(rename = "gravatar_id")]
pub gravatar_id: String,
pub url: String,
#[serde(rename = "html_url")]
pub html_url: String,
#[serde(rename = "followers_url")]
pub followers_url: String,
#[serde(rename = "following_url")]
pub following_url: String,
#[serde(rename = "gists_url")]
pub gists_url: String,
#[serde(rename = "starred_url")]
pub starred_url: String,
#[serde(rename = "subscriptions_url")]
pub subscriptions_url: String,
#[serde(rename = "organizations_url")]
pub organizations_url: String,
#[serde(rename = "repos_url")]
pub repos_url: String,
#[serde(rename = "events_url")]
pub events_url: String,
#[serde(rename = "received_events_url")]
pub received_events_url: String,
#[serde(rename = "type")]
pub type_field: String,
#[serde(rename = "site_admin")]
pub site_admin: bool,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pull {
pub url: String,
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
#[serde(rename = "html_url")]
pub html_url: String,
#[serde(rename = "diff_url")]
pub diff_url: String,
#[serde(rename = "patch_url")]
pub patch_url: String,
#[serde(rename = "issue_url")]
pub issue_url: String,
pub number: i64,
pub state: String,
pub locked: bool,
pub title: String,
pub user: User,
pub body: String,
#[serde(rename = "created_at")]
pub created_at: String,
#[serde(rename = "updated_at")]
pub updated_at: String,
#[serde(rename = "closed_at")]
pub closed_at: ::serde_json::Value,
#[serde(rename = "merged_at")]
pub merged_at: ::serde_json::Value,
#[serde(rename = "merge_commit_sha")]
pub merge_commit_sha: String,
pub assignee: ::serde_json::Value,
pub assignees: Vec<::serde_json::Value>,
#[serde(rename = "requested_reviewers")]
pub requested_reviewers: Vec<RequestedReviewer>,
#[serde(rename = "requested_teams")]
pub requested_teams: Vec<::serde_json::Value>,
pub labels: Vec<Label>,
pub milestone: ::serde_json::Value,
pub draft: bool,
#[serde(rename = "commits_url")]
pub commits_url: String,
#[serde(rename = "review_comments_url")]
pub review_comments_url: String,
#[serde(rename = "review_comment_url")]
pub review_comment_url: String,
#[serde(rename = "comments_url")]
pub comments_url: String,
#[serde(rename = "statuses_url")]
pub statuses_url: String,
pub head: Head,
pub base: Base,
#[serde(rename = "_links")]
pub links: Links,
#[serde(rename = "author_association")]
pub author_association: String,
#[serde(rename = "active_lock_reason")]
pub active_lock_reason: ::serde_json::Value,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct User {
pub login: String,
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
#[serde(rename = "avatar_url")]
pub avatar_url: String,
#[serde(rename = "gravatar_id")]
pub gravatar_id: String,
pub url: String,
#[serde(rename = "html_url")]
pub html_url: String,
#[serde(rename = "followers_url")]
pub followers_url: String,
#[serde(rename = "following_url")]
pub following_url: String,
#[serde(rename = "gists_url")]
pub gists_url: String,
#[serde(rename = "starred_url")]
pub starred_url: String,
#[serde(rename = "subscriptions_url")]
pub subscriptions_url: String,
#[serde(rename = "organizations_url")]
pub organizations_url: String,
#[serde(rename = "repos_url")]
pub repos_url: String,
#[serde(rename = "events_url")]
pub events_url: String,
#[serde(rename = "received_events_url")]
pub received_events_url: String,
#[serde(rename = "type")]
pub type_field: String,
#[serde(rename = "site_admin")]
pub site_admin: bool,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RequestedReviewer {
pub login: String,
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
#[serde(rename = "avatar_url")]
pub avatar_url: String,
#[serde(rename = "gravatar_id")]
pub gravatar_id: String,
pub url: String,
#[serde(rename = "html_url")]
pub html_url: String,
#[serde(rename = "followers_url")]
pub followers_url: String,
#[serde(rename = "following_url")]
pub following_url: String,
#[serde(rename = "gists_url")]
pub gists_url: String,
#[serde(rename = "starred_url")]
pub starred_url: String,
#[serde(rename = "subscriptions_url")]
pub subscriptions_url: String,
#[serde(rename = "organizations_url")]
pub organizations_url: String,
#[serde(rename = "repos_url")]
pub repos_url: String,
#[serde(rename = "events_url")]
pub events_url: String,
#[serde(rename = "received_events_url")]
pub received_events_url: String,
#[serde(rename = "type")]
pub type_field: String,
#[serde(rename = "site_admin")]
pub site_admin: bool,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Label {
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
pub url: String,
pub name: String,
pub color: String,
pub default: bool,
pub description: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Head {
pub label: String,
#[serde(rename = "ref")]
pub ref_field: String,
pub sha: String,
pub user: User2,
pub repo: Option<Repo>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct User2 {
pub login: String,
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
#[serde(rename = "avatar_url")]
pub avatar_url: String,
#[serde(rename = "gravatar_id")]
pub gravatar_id: String,
pub url: String,
#[serde(rename = "html_url")]
pub html_url: String,
#[serde(rename = "followers_url")]
pub followers_url: String,
#[serde(rename = "following_url")]
pub following_url: String,
#[serde(rename = "gists_url")]
pub gists_url: String,
#[serde(rename = "starred_url")]
pub starred_url: String,
#[serde(rename = "subscriptions_url")]
pub subscriptions_url: String,
#[serde(rename = "organizations_url")]
pub organizations_url: String,
#[serde(rename = "repos_url")]
pub repos_url: String,
#[serde(rename = "events_url")]
pub events_url: String,
#[serde(rename = "received_events_url")]
pub received_events_url: String,
#[serde(rename = "type")]
pub type_field: String,
#[serde(rename = "site_admin")]
pub site_admin: bool,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Repo {
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
pub name: String,
#[serde(rename = "full_name")]
pub full_name: String,
pub private: bool,
pub owner: Owner,
#[serde(rename = "html_url")]
pub html_url: String,
pub description: String,
pub fork: bool,
pub url: String,
#[serde(rename = "forks_url")]
pub forks_url: String,
#[serde(rename = "keys_url")]
pub keys_url: String,
#[serde(rename = "collaborators_url")]
pub collaborators_url: String,
#[serde(rename = "teams_url")]
pub teams_url: String,
#[serde(rename = "hooks_url")]
pub hooks_url: String,
#[serde(rename = "issue_events_url")]
pub issue_events_url: String,
#[serde(rename = "events_url")]
pub events_url: String,
#[serde(rename = "assignees_url")]
pub assignees_url: String,
#[serde(rename = "branches_url")]
pub branches_url: String,
#[serde(rename = "tags_url")]
pub tags_url: String,
#[serde(rename = "blobs_url")]
pub blobs_url: String,
#[serde(rename = "git_tags_url")]
pub git_tags_url: String,
#[serde(rename = "git_refs_url")]
pub git_refs_url: String,
#[serde(rename = "trees_url")]
pub trees_url: String,
#[serde(rename = "statuses_url")]
pub statuses_url: String,
#[serde(rename = "languages_url")]
pub languages_url: String,
#[serde(rename = "stargazers_url")]
pub stargazers_url: String,
#[serde(rename = "contributors_url")]
pub contributors_url: String,
#[serde(rename = "subscribers_url")]
pub subscribers_url: String,
#[serde(rename = "subscription_url")]
pub subscription_url: String,
#[serde(rename = "commits_url")]
pub commits_url: String,
#[serde(rename = "git_commits_url")]
pub git_commits_url: String,
#[serde(rename = "comments_url")]
pub comments_url: String,
#[serde(rename = "issue_comment_url")]
pub issue_comment_url: String,
#[serde(rename = "contents_url")]
pub contents_url: String,
#[serde(rename = "compare_url")]
pub compare_url: String,
#[serde(rename = "merges_url")]
pub merges_url: String,
#[serde(rename = "archive_url")]
pub archive_url: String,
#[serde(rename = "downloads_url")]
pub downloads_url: String,
#[serde(rename = "issues_url")]
pub issues_url: String,
#[serde(rename = "pulls_url")]
pub pulls_url: String,
#[serde(rename = "milestones_url")]
pub milestones_url: String,
#[serde(rename = "notifications_url")]
pub notifications_url: String,
#[serde(rename = "labels_url")]
pub labels_url: String,
#[serde(rename = "releases_url")]
pub releases_url: String,
#[serde(rename = "deployments_url")]
pub deployments_url: String,
#[serde(rename = "created_at")]
pub created_at: String,
#[serde(rename = "updated_at")]
pub updated_at: String,
#[serde(rename = "pushed_at")]
pub pushed_at: String,
#[serde(rename = "git_url")]
pub git_url: String,
#[serde(rename = "ssh_url")]
pub ssh_url: String,
#[serde(rename = "clone_url")]
pub clone_url: String,
#[serde(rename = "svn_url")]
pub svn_url: String,
pub homepage: Option<String>,
pub size: i64,
#[serde(rename = "stargazers_count")]
pub stargazers_count: i64,
#[serde(rename = "watchers_count")]
pub watchers_count: i64,
pub language: Option<String>,
#[serde(rename = "has_issues")]
pub has_issues: bool,
#[serde(rename = "has_projects")]
pub has_projects: bool,
#[serde(rename = "has_downloads")]
pub has_downloads: bool,
#[serde(rename = "has_wiki")]
pub has_wiki: bool,
#[serde(rename = "has_pages")]
pub has_pages: bool,
#[serde(rename = "forks_count")]
pub forks_count: i64,
#[serde(rename = "mirror_url")]
pub mirror_url: ::serde_json::Value,
pub archived: bool,
pub disabled: bool,
#[serde(rename = "open_issues_count")]
pub open_issues_count: i64,
pub license: License,
pub forks: i64,
#[serde(rename = "open_issues")]
pub open_issues: i64,
pub watchers: i64,
#[serde(rename = "default_branch")]
pub default_branch: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Owner {
pub login: String,
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
#[serde(rename = "avatar_url")]
pub avatar_url: String,
#[serde(rename = "gravatar_id")]
pub gravatar_id: String,
pub url: String,
#[serde(rename = "html_url")]
pub html_url: String,
#[serde(rename = "followers_url")]
pub followers_url: String,
#[serde(rename = "following_url")]
pub following_url: String,
#[serde(rename = "gists_url")]
pub gists_url: String,
#[serde(rename = "starred_url")]
pub starred_url: String,
#[serde(rename = "subscriptions_url")]
pub subscriptions_url: String,
#[serde(rename = "organizations_url")]
pub organizations_url: String,
#[serde(rename = "repos_url")]
pub repos_url: String,
#[serde(rename = "events_url")]
pub events_url: String,
#[serde(rename = "received_events_url")]
pub received_events_url: String,
#[serde(rename = "type")]
pub type_field: String,
#[serde(rename = "site_admin")]
pub site_admin: bool,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct License {
pub key: String,
pub name: String,
#[serde(rename = "spdx_id")]
pub spdx_id: String,
pub url: ::serde_json::Value,
#[serde(rename = "node_id")]
pub node_id: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Base {
pub label: String,
#[serde(rename = "ref")]
pub ref_field: String,
pub sha: String,
pub user: User3,
pub repo: Repo2,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct User3 {
pub login: String,
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
#[serde(rename = "avatar_url")]
pub avatar_url: String,
#[serde(rename = "gravatar_id")]
pub gravatar_id: String,
pub url: String,
#[serde(rename = "html_url")]
pub html_url: String,
#[serde(rename = "followers_url")]
pub followers_url: String,
#[serde(rename = "following_url")]
pub following_url: String,
#[serde(rename = "gists_url")]
pub gists_url: String,
#[serde(rename = "starred_url")]
pub starred_url: String,
#[serde(rename = "subscriptions_url")]
pub subscriptions_url: String,
#[serde(rename = "organizations_url")]
pub organizations_url: String,
#[serde(rename = "repos_url")]
pub repos_url: String,
#[serde(rename = "events_url")]
pub events_url: String,
#[serde(rename = "received_events_url")]
pub received_events_url: String,
#[serde(rename = "type")]
pub type_field: String,
#[serde(rename = "site_admin")]
pub site_admin: bool,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Repo2 {
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
pub name: String,
#[serde(rename = "full_name")]
pub full_name: String,
pub private: bool,
pub owner: Owner2,
#[serde(rename = "html_url")]
pub html_url: String,
pub description: String,
pub fork: bool,
pub url: String,
#[serde(rename = "forks_url")]
pub forks_url: String,
#[serde(rename = "keys_url")]
pub keys_url: String,
#[serde(rename = "collaborators_url")]
pub collaborators_url: String,
#[serde(rename = "teams_url")]
pub teams_url: String,
#[serde(rename = "hooks_url")]
pub hooks_url: String,
#[serde(rename = "issue_events_url")]
pub issue_events_url: String,
#[serde(rename = "events_url")]
pub events_url: String,
#[serde(rename = "assignees_url")]
pub assignees_url: String,
#[serde(rename = "branches_url")]
pub branches_url: String,
#[serde(rename = "tags_url")]
pub tags_url: String,
#[serde(rename = "blobs_url")]
pub blobs_url: String,
#[serde(rename = "git_tags_url")]
pub git_tags_url: String,
#[serde(rename = "git_refs_url")]
pub git_refs_url: String,
#[serde(rename = "trees_url")]
pub trees_url: String,
#[serde(rename = "statuses_url")]
pub statuses_url: String,
#[serde(rename = "languages_url")]
pub languages_url: String,
#[serde(rename = "stargazers_url")]
pub stargazers_url: String,
#[serde(rename = "contributors_url")]
pub contributors_url: String,
#[serde(rename = "subscribers_url")]
pub subscribers_url: String,
#[serde(rename = "subscription_url")]
pub subscription_url: String,
#[serde(rename = "commits_url")]
pub commits_url: String,
#[serde(rename = "git_commits_url")]
pub git_commits_url: String,
#[serde(rename = "comments_url")]
pub comments_url: String,
#[serde(rename = "issue_comment_url")]
pub issue_comment_url: String,
#[serde(rename = "contents_url")]
pub contents_url: String,
#[serde(rename = "compare_url")]
pub compare_url: String,
#[serde(rename = "merges_url")]
pub merges_url: String,
#[serde(rename = "archive_url")]
pub archive_url: String,
#[serde(rename = "downloads_url")]
pub downloads_url: String,
#[serde(rename = "issues_url")]
pub issues_url: String,
#[serde(rename = "pulls_url")]
pub pulls_url: String,
#[serde(rename = "milestones_url")]
pub milestones_url: String,
#[serde(rename = "notifications_url")]
pub notifications_url: String,
#[serde(rename = "labels_url")]
pub labels_url: String,
#[serde(rename = "releases_url")]
pub releases_url: String,
#[serde(rename = "deployments_url")]
pub deployments_url: String,
#[serde(rename = "created_at")]
pub created_at: String,
#[serde(rename = "updated_at")]
pub updated_at: String,
#[serde(rename = "pushed_at")]
pub pushed_at: String,
#[serde(rename = "git_url")]
pub git_url: String,
#[serde(rename = "ssh_url")]
pub ssh_url: String,
#[serde(rename = "clone_url")]
pub clone_url: String,
#[serde(rename = "svn_url")]
pub svn_url: String,
pub homepage: String,
pub size: i64,
#[serde(rename = "stargazers_count")]
pub stargazers_count: i64,
#[serde(rename = "watchers_count")]
pub watchers_count: i64,
pub language: String,
#[serde(rename = "has_issues")]
pub has_issues: bool,
#[serde(rename = "has_projects")]
pub has_projects: bool,
#[serde(rename = "has_downloads")]
pub has_downloads: bool,
#[serde(rename = "has_wiki")]
pub has_wiki: bool,
#[serde(rename = "has_pages")]
pub has_pages: bool,
#[serde(rename = "forks_count")]
pub forks_count: i64,
#[serde(rename = "mirror_url")]
pub mirror_url: ::serde_json::Value,
pub archived: bool,
pub disabled: bool,
#[serde(rename = "open_issues_count")]
pub open_issues_count: i64,
pub license: License2,
pub forks: i64,
#[serde(rename = "open_issues")]
pub open_issues: i64,
pub watchers: i64,
#[serde(rename = "default_branch")]
pub default_branch: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Owner2 {
pub login: String,
pub id: i64,
#[serde(rename = "node_id")]
pub node_id: String,
#[serde(rename = "avatar_url")]
pub avatar_url: String,
#[serde(rename = "gravatar_id")]
pub gravatar_id: String,
pub url: String,
#[serde(rename = "html_url")]
pub html_url: String,
#[serde(rename = "followers_url")]
pub followers_url: String,
#[serde(rename = "following_url")]
pub following_url: String,
#[serde(rename = "gists_url")]
pub gists_url: String,
#[serde(rename = "starred_url")]
pub starred_url: String,
#[serde(rename = "subscriptions_url")]
pub subscriptions_url: String,
#[serde(rename = "organizations_url")]
pub organizations_url: String,
#[serde(rename = "repos_url")]
pub repos_url: String,
#[serde(rename = "events_url")]
pub events_url: String,
#[serde(rename = "received_events_url")]
pub received_events_url: String,
#[serde(rename = "type")]
pub type_field: String,
#[serde(rename = "site_admin")]
pub site_admin: bool,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct License2 {
pub key: String,
pub name: String,
#[serde(rename = "spdx_id")]
pub spdx_id: String,
pub url: ::serde_json::Value,
#[serde(rename = "node_id")]
pub node_id: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Links {
#[serde(rename = "self")]
pub self_field: SelfField,
pub html: Html,
pub issue: Issue,
pub comments: Comments,
#[serde(rename = "review_comments")]
pub review_comments: ReviewComments,
#[serde(rename = "review_comment")]
pub review_comment: ReviewComment,
pub commits: Commits,
pub statuses: Statuses,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SelfField {
pub href: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Html {
pub href: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Issue {
pub href: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Comments {
pub href: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReviewComments {
pub href: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReviewComment {
pub href: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Commits {
pub href: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Statuses {
pub href: String,
}