Skip to content

Commit dcb3779

Browse files
committed
Use ? and match to make encoding better match the structure being encoded.
1 parent 96c9655 commit dcb3779

File tree

3 files changed

+55
-63
lines changed

3 files changed

+55
-63
lines changed

src/song.rs

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,11 @@ pub struct Range(pub Duration, pub Option<Duration>);
5050
impl Encodable for Range {
5151
fn encode<S: Encoder>(&self, e: &mut S) -> Result<(), S::Error> {
5252
e.emit_tuple(2, |e| {
53-
e.emit_tuple_arg(0, |e| e.emit_i64(self.0.num_seconds())).and_then(|_| {
54-
e.emit_tuple_arg(1, |e| {
55-
e.emit_option(|e| {
56-
self.1
57-
.map(|d| e.emit_option_some(|e| d.num_seconds().encode(e)))
58-
.unwrap_or_else(|| e.emit_option_none())
59-
})
53+
e.emit_tuple_arg(0, |e| e.emit_i64(self.0.num_seconds()))?;
54+
e.emit_tuple_arg(1, |e| {
55+
e.emit_option(|e| match self.1 {
56+
Some(d) => e.emit_option_some(|e| d.num_seconds().encode(e)),
57+
None => e.emit_option_none(),
6058
})
6159
})
6260
})
@@ -71,11 +69,12 @@ impl Default for Range {
7169

7270
impl fmt::Display for Range {
7371
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
74-
self.0
75-
.num_seconds()
76-
.fmt(f)
77-
.and_then(|_| f.write_str(":"))
78-
.and_then(|_| self.1.map(|v| v.num_seconds().fmt(f)).unwrap_or(Ok(())))
72+
self.0.num_seconds().fmt(f)?;
73+
f.write_str(":")?;
74+
if let Some(v) = self.1 {
75+
v.num_seconds().fmt(f)?;
76+
}
77+
Ok(())
7978
}
8079
}
8180

@@ -116,32 +115,25 @@ pub struct Song {
116115
impl Encodable for Song {
117116
fn encode<S: Encoder>(&self, e: &mut S) -> Result<(), S::Error> {
118117
e.emit_struct("Song", 8, |e| {
119-
e.emit_struct_field("file", 0, |e| self.file.encode(e))
120-
.and_then(|_| e.emit_struct_field("name", 1, |e| self.name.encode(e)))
121-
.and_then(|_| e.emit_struct_field("title", 2, |e| self.title.encode(e)))
122-
.and_then(|_| {
123-
e.emit_struct_field("last_mod", 3, |e| {
124-
e.emit_option(|e| {
125-
self.last_mod
126-
.as_ref()
127-
.map(|m| e.emit_option_some(|e| m.to_timespec().sec.encode(e)))
128-
.unwrap_or_else(|| e.emit_option_none())
129-
})
118+
e.emit_struct_field("file", 0, |e| self.file.encode(e))?;
119+
e.emit_struct_field("name", 1, |e| self.name.encode(e))?;
120+
e.emit_struct_field("title", 2, |e| self.title.encode(e))?;
121+
e.emit_struct_field("last_mod", 3, |e| {
122+
e.emit_option(|e| match self.last_mod {
123+
Some(m) => e.emit_option_some(|e| m.to_timespec().sec.encode(e)),
124+
None => e.emit_option_none(),
130125
})
131-
})
132-
.and_then(|_| {
133-
e.emit_struct_field("duration", 4, |e| {
134-
e.emit_option(|e| {
135-
self.duration
136-
.as_ref()
137-
.map(|d| e.emit_option_some(|e| d.num_seconds().encode(e)))
138-
.unwrap_or_else(|| e.emit_option_none())
139-
})
126+
})?;
127+
e.emit_struct_field("duration", 4, |e| {
128+
e.emit_option(|e| match self.duration {
129+
Some(d) => e.emit_option_some(|e| d.num_seconds().encode(e)),
130+
None => e.emit_option_none(),
140131
})
141-
})
142-
.and_then(|_| e.emit_struct_field("place", 5, |e| self.place.encode(e)))
143-
.and_then(|_| e.emit_struct_field("range", 6, |e| self.range.encode(e)))
144-
.and_then(|_| e.emit_struct_field("tags", 7, |e| self.tags.encode(e)))
132+
})?;
133+
e.emit_struct_field("place", 5, |e| self.place.encode(e))?;
134+
e.emit_struct_field("range", 6, |e| self.range.encode(e))?;
135+
e.emit_struct_field("tags", 7, |e| self.tags.encode(e))?;
136+
Ok(())
145137
})
146138
}
147139
}

src/stats.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@ pub struct Stats {
2828
impl Encodable for Stats {
2929
fn encode<S: Encoder>(&self, e: &mut S) -> Result<(), S::Error> {
3030
e.emit_struct("Stats", 7, |e| {
31-
e.emit_struct_field("artists", 0, |e| self.artists.encode(e))
32-
.and_then(|_| e.emit_struct_field("albums", 1, |e| self.albums.encode(e)))
33-
.and_then(|_| e.emit_struct_field("songs", 2, |e| self.songs.encode(e)))
34-
.and_then(|_| e.emit_struct_field("uptime", 3, |e| self.uptime.num_seconds().encode(e)))
35-
.and_then(|_| e.emit_struct_field("playtime", 4, |e| self.playtime.num_seconds().encode(e)))
36-
.and_then(|_| e.emit_struct_field("db_playtime", 5, |e| self.db_playtime.num_seconds().encode(e)))
37-
.and_then(|_| e.emit_struct_field("db_update", 6, |e| self.db_update.sec.encode(e)))
31+
e.emit_struct_field("artists", 0, |e| self.artists.encode(e))?;
32+
e.emit_struct_field("albums", 1, |e| self.albums.encode(e))?;
33+
e.emit_struct_field("songs", 2, |e| self.songs.encode(e))?;
34+
e.emit_struct_field("uptime", 3, |e| self.uptime.num_seconds().encode(e))?;
35+
e.emit_struct_field("playtime", 4, |e| self.playtime.num_seconds().encode(e))?;
36+
e.emit_struct_field("db_playtime", 5, |e| self.db_playtime.num_seconds().encode(e))?;
37+
e.emit_struct_field("db_update", 6, |e| self.db_update.sec.encode(e))?;
38+
Ok(())
3839
})
3940
}
4041
}

src/status.rs

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -71,47 +71,46 @@ impl Encodable for Status {
7171
e.emit_struct_field("nextsong", 9, |e| self.nextsong.encode(e))?;
7272
e.emit_struct_field("time", 10, |e| {
7373
e.emit_option(|e| {
74-
self.time
75-
.map(|p| {
74+
match self.time {
75+
Some(p) => {
7676
e.emit_option_some(|e| {
7777
e.emit_tuple(2, |e| {
7878
e.emit_tuple_arg(0, |e| p.0.num_seconds().encode(e))?;
7979
e.emit_tuple_arg(1, |e| p.1.num_seconds().encode(e))?;
8080
Ok(())
8181
})
8282
})
83-
})
84-
.unwrap_or_else(|| e.emit_option_none())
83+
}
84+
None => e.emit_option_none(),
85+
};
86+
Ok(())
8587
})
8688
})?;
8789
e.emit_struct_field("elapsed", 11, |e| {
88-
e.emit_option(|e| {
89-
self.elapsed
90-
.map(|d| e.emit_option_some(|e| d.num_seconds().encode(e)))
91-
.unwrap_or_else(|| e.emit_option_none())
90+
e.emit_option(|e| match self.elapsed {
91+
Some(d) => e.emit_option_some(|e| d.num_seconds().encode(e)),
92+
None => e.emit_option_none(),
9293
})
94+
9395
})?;
9496
e.emit_struct_field("duration", 12, |e| {
95-
e.emit_option(|e| {
96-
self.duration
97-
.map(|d| e.emit_option_some(|e| d.num_seconds().encode(e)))
98-
.unwrap_or_else(|| e.emit_option_none())
97+
e.emit_option(|e| match self.duration {
98+
Some(d) => e.emit_option_some(|e| d.num_seconds().encode(e)),
99+
None => e.emit_option_none(),
99100
})
100101
})?;
101102
e.emit_struct_field("bitrate", 13, |e| self.bitrate.encode(e))?;
102103
e.emit_struct_field("crossfade", 14, |e| {
103-
e.emit_option(|e| {
104-
self.crossfade
105-
.map(|d| e.emit_option_some(|e| d.num_seconds().encode(e)))
106-
.unwrap_or_else(|| e.emit_option_none())
104+
e.emit_option(|e| match self.crossfade {
105+
Some(d) => e.emit_option_some(|e| d.num_seconds().encode(e)),
106+
None => e.emit_option_none(),
107107
})
108108
})?;
109109
e.emit_struct_field("mixrampdb", 15, |e| self.mixrampdb.encode(e))?;
110110
e.emit_struct_field("mixrampdelay", 16, |e| {
111-
e.emit_option(|e| {
112-
self.mixrampdelay
113-
.map(|d| e.emit_option_some(|e| d.num_seconds().encode(e)))
114-
.unwrap_or_else(|| e.emit_option_none())
111+
e.emit_option(|e| match self.mixrampdelay {
112+
Some(d) => e.emit_option_some(|e| d.num_seconds().encode(e)),
113+
None => e.emit_option_none(),
115114
})
116115
})?;
117116
e.emit_struct_field("audio", 17, |e| self.audio.encode(e))?;

0 commit comments

Comments
 (0)