Skip to content
This repository was archived by the owner on Sep 14, 2023. It is now read-only.

Commit 5231a67

Browse files
authored
Merge pull request #215 from ordian/master
Migrate from rustc-serialize to serde 1.0
2 parents 9a148e5 + 487074d commit 5231a67

20 files changed

+585
-338
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
language: rust
22
rust:
3-
- 1.12.0
3+
- 1.15.0
44
- stable
55
- beta
66
- nightly

Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ test = false
2323
[dependencies]
2424
lazy_static = "0.2"
2525
regex = "0.2"
26-
rustc-serialize = "0.3"
26+
serde = "1.0"
27+
serde_derive = "1.0"
2728
strsim = "0.6"

README.md

+48-19
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ This crate is fully compatible with Cargo. Just add it to your `Cargo.toml`:
2727
```toml
2828
[dependencies]
2929
docopt = "0.7"
30-
rustc-serialize = "0.3" # if you're using `derive(RustcDecodable)`
30+
serde_derive = "1.0" # if you're using `derive(Deserialize)`
3131
```
3232

3333
If you want to use the macro, then add `docopt_macros = "0.7"` instead.
@@ -42,7 +42,8 @@ of the named values in the Docopt usage string. Values will be automatically
4242
converted to those types (or an error will be reported).
4343

4444
```rust
45-
extern crate rustc_serialize;
45+
#[macro_use]
46+
extern crate serde_derive;
4647
extern crate docopt;
4748

4849
use docopt::Docopt;
@@ -66,7 +67,7 @@ Options:
6667
--drifting Drifting mine.
6768
";
6869

69-
#[derive(Debug, RustcDecodable)]
70+
#[derive(Debug, Deserialize)]
7071
struct Args {
7172
flag_speed: isize,
7273
flag_drifting: bool,
@@ -79,7 +80,7 @@ struct Args {
7980

8081
fn main() {
8182
let args: Args = Docopt::new(USAGE)
82-
.and_then(|d| d.decode())
83+
.and_then(|d| d.deserialize())
8384
.unwrap_or_else(|e| e.exit());
8485
println!("{:?}", args);
8586
}
@@ -93,7 +94,8 @@ works on a **nightly Rust compiler**:
9394
#![feature(plugin)]
9495
#![plugin(docopt_macros)]
9596

96-
extern crate rustc_serialize;
97+
#[macro_use]
98+
extern crate serde_derive;
9799
extern crate docopt;
98100

99101
use docopt::Docopt;
@@ -118,7 +120,7 @@ Options:
118120
");
119121

120122
fn main() {
121-
let args: Args = Args::docopt().decode().unwrap_or_else(|e| e.exit());
123+
let args: Args = Args::docopt().deserialize().unwrap_or_else(|e| e.exit());
122124
println!("{:?}", args);
123125
}
124126
```
@@ -150,14 +152,15 @@ Here's another example that shows how to specify the types of your arguments:
150152
#![feature(plugin)]
151153
#![plugin(docopt_macros)]
152154

153-
extern crate rustc_serialize;
155+
#[macro_use]
156+
extern crate serde_derive;
154157

155158
extern crate docopt;
156159

157160
docopt!(Args, "Usage: add <x> <y>", arg_x: i32, arg_y: i32);
158161

159162
fn main() {
160-
let args: Args = Args::docopt().decode().unwrap_or_else(|e| e.exit());
163+
let args: Args = Args::docopt().deserialize().unwrap_or_else(|e| e.exit());
161164
println!("x: {}, y: {}", args.arg_x, args.arg_y);
162165
}
163166
```
@@ -185,10 +188,15 @@ Docopt features.
185188
#![feature(plugin)]
186189
#![plugin(docopt_macros)]
187190

188-
extern crate rustc_serialize;
191+
#[macro_use]
192+
extern crate serde_derive;
193+
extern crate serde;
189194

190195
extern crate docopt;
191196

197+
use serde::de;
198+
use std::fmt;
199+
192200
docopt!(Args derive Debug, "
193201
Usage: rustc [options] [--cfg SPEC... -L PATH...] INPUT
194202
rustc (--help | --version)
@@ -203,27 +211,48 @@ Options:
203211
--opt-level LEVEL Optimize with possible levels 0-3.
204212
", flag_opt_level: Option<OptLevel>, flag_emit: Option<Emit>);
205213

206-
#[derive(RustcDecodable, Debug)]
214+
#[derive(Deserialize, Debug)]
207215
enum Emit { Asm, Ir, Bc, Obj, Link }
208216

209217
#[derive(Debug)]
210218
enum OptLevel { Zero, One, Two, Three }
211219

212-
impl rustc_serialize::Decodable for OptLevel {
213-
fn decode<D: rustc_serialize::Decoder>(d: &mut D) -> Result<OptLevel, D::Error> {
214-
Ok(match try!(d.read_usize()) {
215-
0 => OptLevel::Zero, 1 => OptLevel::One,
216-
2 => OptLevel::Two, 3 => OptLevel::Three,
220+
struct OptLevelVisitor;
221+
222+
impl<'de> de::Visitor<'de> for OptLevelVisitor {
223+
type Value = OptLevel;
224+
225+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
226+
formatter.write_str("an integer between 0 and 3")
227+
}
228+
229+
fn visit_u8<E>(self, value: u8) -> Result<Self::Value, E>
230+
where E: de::Error
231+
{
232+
let level = match value {
233+
0 => OptLevel::Zero,
234+
1 => OptLevel::One,
235+
2 => OptLevel::Two,
236+
3 => OptLevel::Three,
217237
n => {
218-
let err = format!("Could not decode '{}' as opt-level.", n);
219-
return Err(d.error(&*err));
238+
let err = format!("Could not deserialize '{}' as opt-level.", n);
239+
return Err(E::custom(err));
220240
}
221-
})
241+
};
242+
Ok(level)
243+
}
244+
}
245+
246+
impl<'de> de::Deserialize<'de> for OptLevel {
247+
fn deserialize<D>(deserializer: D) -> Result<OptLevel, D::Error>
248+
where D: de::Deserializer<'de>
249+
{
250+
deserializer.deserialize_u8(OptLevelVisitor)
222251
}
223252
}
224253

225254
fn main() {
226-
let args: Args = Args::docopt().decode().unwrap_or_else(|e| e.exit());
255+
let args: Args = Args::docopt().deserialize().unwrap_or_else(|e| e.exit());
227256
println!("{:?}", args);
228257
}
229258
```

docopt_macros/Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ path = ".."
2020
version = "0.7.0"
2121

2222
[dev-dependencies]
23-
rustc-serialize = "0.3"
23+
serde = "1.0"
24+
serde_derive = "1.0"

docopt_macros/examples/add.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
#![feature(plugin)]
22
#![plugin(docopt_macros)]
33

4-
extern crate rustc_serialize;
4+
#[macro_use]
5+
extern crate serde_derive;
56

67
extern crate docopt;
78

89
docopt!(Args, "Usage: add <x> <y>", arg_x: usize, arg_y: usize);
910

1011
fn main() {
11-
let args: Args = Args::docopt().decode().unwrap_or_else(|e| e.exit());
12+
let args: Args = Args::docopt().deserialize().unwrap_or_else(|e| e.exit());
1213
println!("x: {}, y: {}", args.arg_x, args.arg_y);
1314
}

docopt_macros/examples/cp.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#![feature(plugin)]
22
#![plugin(docopt_macros)]
33

4-
extern crate rustc_serialize;
4+
#[macro_use]
5+
extern crate serde_derive;
56

67
extern crate docopt;
78

@@ -16,6 +17,6 @@ Options:
1617
");
1718

1819
fn main() {
19-
let args: Args = Args::docopt().decode().unwrap_or_else(|e| e.exit());
20+
let args: Args = Args::docopt().deserialize().unwrap_or_else(|e| e.exit());
2021
println!("{:?}", args);
2122
}

docopt_macros/examples/macro.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#![feature(plugin)]
22
#![plugin(docopt_macros)]
33

4-
extern crate rustc_serialize;
4+
#[macro_use]
5+
extern crate serde_derive;
56

67
extern crate docopt;
78

@@ -25,7 +26,7 @@ Options:
2526
", arg_x: Option<usize>, arg_y: Option<usize>, flag_speed: usize);
2627

2728
fn main() {
28-
let args: Args = Args::docopt().decode().unwrap_or_else(|e| e.exit());
29+
let args: Args = Args::docopt().deserialize().unwrap_or_else(|e| e.exit());
2930
println!("{:?}", args);
3031

3132
println!("\nSome values:");

docopt_macros/examples/rustc.rs

+50-13
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
#![feature(plugin)]
22
#![plugin(docopt_macros)]
33

4-
extern crate rustc_serialize;
4+
#[macro_use]
5+
extern crate serde_derive;
6+
extern crate serde;
57

68
extern crate docopt;
79

10+
use serde::de;
11+
use std::fmt;
12+
813
docopt!(Args derive Debug, "
914
Usage: rustc [options] [--cfg SPEC... -L PATH...] INPUT
1015
rustc (--help | --version)
@@ -19,26 +24,58 @@ Options:
1924
--opt-level LEVEL Optimize with possible levels 0-3.
2025
", flag_opt_level: Option<OptLevel>, flag_emit: Option<Emit>);
2126

22-
#[derive(Debug, RustcDecodable)]
23-
enum Emit { Asm, Ir, Bc, Obj, Link }
27+
#[derive(Debug, Deserialize)]
28+
enum Emit {
29+
Asm,
30+
Ir,
31+
Bc,
32+
Obj,
33+
Link,
34+
}
2435

2536
#[derive(Debug)]
26-
enum OptLevel { Zero, One, Two, Three }
37+
enum OptLevel {
38+
Zero,
39+
One,
40+
Two,
41+
Three,
42+
}
43+
44+
struct OptLevelVisitor;
45+
46+
impl<'de> de::Visitor<'de> for OptLevelVisitor {
47+
type Value = OptLevel;
2748

28-
impl rustc_serialize::Decodable for OptLevel {
29-
fn decode<D: rustc_serialize::Decoder>(d: &mut D) -> Result<OptLevel, D::Error> {
30-
Ok(match try!(d.read_usize()) {
31-
0 => OptLevel::Zero, 1 => OptLevel::One,
32-
2 => OptLevel::Two, 3 => OptLevel::Three,
49+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
50+
formatter.write_str("an integer between 0 and 3")
51+
}
52+
53+
fn visit_u8<E>(self, value: u8) -> Result<Self::Value, E>
54+
where E: de::Error
55+
{
56+
let level = match value {
57+
0 => OptLevel::Zero,
58+
1 => OptLevel::One,
59+
2 => OptLevel::Two,
60+
3 => OptLevel::Three,
3361
n => {
34-
let err = format!("Could not decode '{}' as opt-level.", n);
35-
return Err(d.error(&*err));
62+
let err = format!("Could not deserialize '{}' as opt-level.", n);
63+
return Err(E::custom(err));
3664
}
37-
})
65+
};
66+
Ok(level)
67+
}
68+
}
69+
70+
impl<'de> de::Deserialize<'de> for OptLevel {
71+
fn deserialize<D>(deserializer: D) -> Result<OptLevel, D::Error>
72+
where D: de::Deserializer<'de>
73+
{
74+
deserializer.deserialize_u8(OptLevelVisitor)
3875
}
3976
}
4077

4178
fn main() {
42-
let args: Args = Args::docopt().decode().unwrap_or_else(|e| e.exit());
79+
let args: Args = Args::docopt().deserialize().unwrap_or_else(|e| e.exit());
4380
println!("{:?}", args);
4481
}

docopt_macros/src/macro.rs

+12-11
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ impl Parsed {
8888
let def = ast::VariantData::Struct(
8989
self.struct_fields(cx), ast::DUMMY_NODE_ID);
9090

91-
let mut traits = vec!["RustcDecodable".to_string()];
91+
let mut traits = vec!["Deserialize".to_string()];
9292
traits.extend(self.struct_info.deriving.iter().cloned());
9393
let attrs = vec![attribute(cx, "allow", vec!["non_snake_case"]),
9494
attribute(cx, "derive", traits)];
@@ -172,8 +172,8 @@ impl<'a, 'b> MacParser<'a, 'b> {
172172
self.cx.call_site(), "macro expects arguments");
173173
return Err(err);
174174
}
175-
let struct_info = try!(self.parse_struct_info());
176-
let docstr = try!(self.parse_str());
175+
let struct_info = self.parse_struct_info()?;
176+
let docstr = self.parse_str()?;
177177

178178
let mut types = HashMap::new();
179179
if !self.p.check(&token::Eof) {
@@ -190,7 +190,7 @@ impl<'a, 'b> MacParser<'a, 'b> {
190190
(Atom::new(&*key), ty)
191191
})
192192
.collect::<HashMap<Atom, P<ast::Ty>>>();
193-
try!(self.p.expect(&token::Eof));
193+
self.p.expect(&token::Eof)?;
194194
}
195195

196196
// This config does not matter because we're only asking for the
@@ -248,8 +248,8 @@ impl<'a, 'b> MacParser<'a, 'b> {
248248
/// Note that this is a static method as it is used as a HOF.
249249
fn parse_type_annotation(p: &mut Parser<'b>)
250250
-> PResult<'b, (ast::Ident, P<ast::Ty>)> {
251-
let ident = try!(p.parse_ident());
252-
try!(p.expect(&token::Colon));
251+
let ident = p.parse_ident()?;
252+
p.expect(&token::Colon)?;
253253
let ty = p.parse_ty().unwrap();
254254
Ok((ident, ty))
255255
}
@@ -258,12 +258,12 @@ impl<'a, 'b> MacParser<'a, 'b> {
258258
fn parse_struct_info(&mut self) -> PResult<'b, StructInfo> {
259259
let public = self.p.eat_keyword(symbol::keywords::Pub);
260260
let mut info = StructInfo {
261-
name: try!(self.p.parse_ident()),
261+
name: self.p.parse_ident()?,
262262
public: public,
263263
deriving: vec![],
264264
};
265265
if self.p.eat(&token::Comma) { return Ok(info); }
266-
let deriving = try!(self.p.parse_ident());
266+
let deriving = self.p.parse_ident()?;
267267
if *deriving.name.as_str() != *"derive" {
268268
let err = format!("Expected 'derive' keyword but got '{}'",
269269
deriving);
@@ -272,7 +272,7 @@ impl<'a, 'b> MacParser<'a, 'b> {
272272
}
273273
while !self.p.eat(&token::Comma) {
274274
info.deriving.push(
275-
try!(self.p.parse_ident()).name.to_string());
275+
self.p.parse_ident()?.name.to_string());
276276
}
277277
Ok(info)
278278
}
@@ -313,12 +313,13 @@ fn ty_vec_string(cx: &ExtCtxt) -> P<ast::Ty> {
313313
let sp = codemap::DUMMY_SP;
314314
let tystr = ast::AngleBracketedParameterData {
315315
lifetimes: vec![],
316-
types: P::from_vec(vec![cx.ty_ident(sp, ident("String"))]),
317-
bindings: P::new(),
316+
types: vec![cx.ty_ident(sp, ident("String"))],
317+
bindings: vec![],
318318
};
319319
cx.ty_path(ast::Path {
320320
span: sp,
321321
segments: vec![ast::PathSegment {
322+
span: sp,
322323
identifier: ident("Vec"),
323324
parameters: Some(P(ast::PathParameters::AngleBracketed(tystr))),
324325
}]

0 commit comments

Comments
 (0)