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
extern crate serde_json;
use self::super::{Error, Github, Result};
use rep::{Gist, GistFork, GistOptions, GistListOptions};
pub struct UserGists<'a> {
github: &'a Github<'a>,
owner: String,
}
impl<'a> UserGists<'a> {
pub fn new<O>(github: &'a Github<'a>, owner: O) -> UserGists<'a>
where O: Into<String>
{
UserGists {
github: github,
owner: owner.into(),
}
}
pub fn list(&self, options: &GistListOptions) -> Result<Vec<Gist>> {
let mut uri = vec![format!("/users/{}/gists", self.owner)];
if let Some(query) = options.serialize() {
uri.push(query);
}
self.github.get::<Vec<Gist>>(&uri.join("?"))
}
}
pub struct Gists<'a> {
github: &'a Github<'a>,
}
impl<'a> Gists<'a> {
pub fn new(github: &'a Github<'a>) -> Gists<'a> {
Gists { github: github }
}
fn path(&self, more: &str) -> String {
format!("/gists{}", more)
}
pub fn star(&self, id: &str) -> Result<()> {
match self.github
.put::<String>(&self.path(&format!("/{}/star", id)), &[])
.map(|_| ()) {
Err(Error::Codec(_)) => Ok(()),
otherwise => otherwise,
}
}
pub fn unstar(&self, id: &str) -> Result<()> {
self.github
.delete(&self.path(&format!("/{}/star", id)))
}
pub fn fork(&self, id: &str) -> Result<Gist> {
self.github.post::<Gist>(&self.path(&format!("/{}/forks", id)), &[])
}
pub fn forks(&self, id: &str) -> Result<Vec<GistFork>> {
self.github.get::<Vec<GistFork>>(&self.path(&format!("/{}/forks", id)))
}
pub fn delete(&self, id: &str) -> Result<()> {
self.github
.delete(&self.path(&format!("/{}", id)))
}
pub fn get(&self, id: &str) -> Result<Gist> {
self.github.get::<Gist>(&self.path(&format!("/{}", id)))
}
pub fn getrev(&self, id: &str, sha: &str) -> Result<Gist> {
self.github.get::<Gist>(&self.path(&format!("/{}/{}", id, sha)))
}
pub fn list(&self, options: &GistListOptions) -> Result<Vec<Gist>> {
let mut uri = vec![self.path("")];
if let Some(query) = options.serialize() {
uri.push(query);
}
self.github.get::<Vec<Gist>>(&uri.join("?"))
}
pub fn public(&self) -> Result<Vec<Gist>> {
self.github.get::<Vec<Gist>>(&self.path("/public"))
}
pub fn starred(&self) -> Result<Vec<Gist>> {
self.github.get::<Vec<Gist>>(&self.path("/starred"))
}
pub fn create(&self, gist: &GistOptions) -> Result<Gist> {
let data = try!(serde_json::to_string(&gist));
self.github.post::<Gist>(&self.path(""), data.as_bytes())
}
}