]>
Commit | Line | Data |
---|---|---|
416331ca XL |
1 | // run-pass |
2 | ||
0bf4aa26 XL |
3 | #![allow(unused_must_use)] |
4 | #![allow(dead_code)] | |
5 | #![allow(unused_imports)] | |
d9579d0f | 6 | #![feature(rustc_private)] |
1a4d82fc | 7 | |
72b1a166 FG |
8 | extern crate rustc_macros; |
9 | extern crate rustc_serialize; | |
1a4d82fc | 10 | |
1a4d82fc | 11 | use std::fmt; |
72b1a166 FG |
12 | use std::io::prelude::*; |
13 | use std::io::Cursor; | |
1a4d82fc JJ |
14 | use std::slice; |
15 | ||
72b1a166 | 16 | use rustc_macros::Encodable; |
416331ca XL |
17 | use rustc_serialize::json; |
18 | use rustc_serialize::opaque; | |
72b1a166 | 19 | use rustc_serialize::{Encodable, Encoder}; |
1a4d82fc | 20 | |
72b1a166 | 21 | #[derive(Encodable)] |
1a4d82fc JJ |
22 | struct Foo { |
23 | baz: bool, | |
24 | } | |
25 | ||
72b1a166 | 26 | #[derive(Encodable)] |
1a4d82fc | 27 | struct Bar { |
c34b1796 | 28 | froboz: usize, |
1a4d82fc JJ |
29 | } |
30 | ||
31 | enum WireProtocol { | |
32 | JSON, | |
9e0c209e | 33 | Opaque, |
1a4d82fc JJ |
34 | // ... |
35 | } | |
36 | ||
72b1a166 | 37 | fn encode_json<T: for<'a> Encodable<json::Encoder<'a>>>(val: &T, wr: &mut Cursor<Vec<u8>>) { |
1a4d82fc JJ |
38 | write!(wr, "{}", json::as_json(val)); |
39 | } | |
72b1a166 | 40 | fn encode_opaque<T: Encodable<opaque::Encoder>>(val: &T, wr: Vec<u8>) { |
9e0c209e | 41 | let mut encoder = opaque::Encoder::new(wr); |
1a4d82fc JJ |
42 | val.encode(&mut encoder); |
43 | } | |
44 | ||
45 | pub fn main() { | |
72b1a166 | 46 | let target = Foo { baz: false }; |
1a4d82fc JJ |
47 | let proto = WireProtocol::JSON; |
48 | match proto { | |
8faf50e0 | 49 | WireProtocol::JSON => encode_json(&target, &mut Cursor::new(Vec::new())), |
72b1a166 | 50 | WireProtocol::Opaque => encode_opaque(&target, Vec::new()), |
1a4d82fc JJ |
51 | } |
52 | } |