mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-13 16:01:02 +00:00
Variation to support option and a json-ish value
This commit is contained in:
+72
-9
@@ -3,8 +3,9 @@ extern crate serde2;
|
|||||||
use serde2::de2;
|
use serde2::de2;
|
||||||
use serde2::de2::{Deserialize, Deserializer};
|
use serde2::de2::{Deserialize, Deserializer};
|
||||||
|
|
||||||
|
#[deriving(Show)]
|
||||||
enum Token {
|
enum Token {
|
||||||
//Null,
|
Null,
|
||||||
Int(int),
|
Int(int),
|
||||||
//String(String),
|
//String(String),
|
||||||
SeqStart(uint),
|
SeqStart(uint),
|
||||||
@@ -58,11 +59,9 @@ impl<Iter: Iterator<Token>> Deserializer<Error> for MyDeserializer<Iter> {
|
|||||||
V: de2::Visitor<MyDeserializer<Iter>, R, Error>,
|
V: de2::Visitor<MyDeserializer<Iter>, R, Error>,
|
||||||
>(&mut self, visitor: &mut V) -> Result<R, Error> {
|
>(&mut self, visitor: &mut V) -> Result<R, Error> {
|
||||||
match self.next() {
|
match self.next() {
|
||||||
/*
|
|
||||||
Some(Null) => {
|
Some(Null) => {
|
||||||
visitor.visit_null(self)
|
visitor.visit_null(self)
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
Some(Int(v)) => {
|
Some(Int(v)) => {
|
||||||
visitor.visit_int(self, v)
|
visitor.visit_int(self, v)
|
||||||
}
|
}
|
||||||
@@ -88,6 +87,21 @@ impl<Iter: Iterator<Token>> Deserializer<Error> for MyDeserializer<Iter> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_option<
|
||||||
|
T: Deserialize<MyDeserializer<Iter>, Error>,
|
||||||
|
>(&mut self) -> Result<Option<T>, Error> {
|
||||||
|
match self.peek() {
|
||||||
|
Some(&Null) => {
|
||||||
|
self.next();
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
let v = try!(Deserialize::deserialize(self));
|
||||||
|
Ok(Some(v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn syntax_error(&mut self) -> Error {
|
fn syntax_error(&mut self) -> Error {
|
||||||
SyntaxError
|
SyntaxError
|
||||||
}
|
}
|
||||||
@@ -173,7 +187,7 @@ mod json {
|
|||||||
|
|
||||||
#[deriving(Show)]
|
#[deriving(Show)]
|
||||||
pub enum Value {
|
pub enum Value {
|
||||||
//Null,
|
Null,
|
||||||
//Bool(bool),
|
//Bool(bool),
|
||||||
Int(int),
|
Int(int),
|
||||||
//String(String),
|
//String(String),
|
||||||
@@ -192,11 +206,9 @@ mod json {
|
|||||||
D: de2::Deserializer<E>,
|
D: de2::Deserializer<E>,
|
||||||
E,
|
E,
|
||||||
> de2::Visitor<D, Value, E> for Visitor {
|
> de2::Visitor<D, Value, E> for Visitor {
|
||||||
/*
|
|
||||||
fn visit_null(&mut self, _d: &mut D) -> Result<Value, E> {
|
fn visit_null(&mut self, _d: &mut D) -> Result<Value, E> {
|
||||||
Ok(Null)
|
Ok(Null)
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
fn visit_int(&mut self, _d: &mut D, v: int) -> Result<Value, E> {
|
fn visit_int(&mut self, _d: &mut D, v: int) -> Result<Value, E> {
|
||||||
Ok(Int(v))
|
Ok(Int(v))
|
||||||
@@ -208,6 +220,17 @@ mod json {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
fn visit_option<
|
||||||
|
Visitor: de2::OptionVisitor<D, E>,
|
||||||
|
>(&mut self, d: &mut D, mut visitor: Visitor) -> Result<Value, E> {
|
||||||
|
match visitor.next(d) {
|
||||||
|
Some(v) => v,
|
||||||
|
None => Ok(Null),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
fn visit_seq<
|
fn visit_seq<
|
||||||
Visitor: de2::SeqVisitor<D, E>,
|
Visitor: de2::SeqVisitor<D, E>,
|
||||||
>(&mut self, d: &mut D, mut visitor: Visitor) -> Result<Value, E> {
|
>(&mut self, d: &mut D, mut visitor: Visitor) -> Result<Value, E> {
|
||||||
@@ -266,7 +289,7 @@ fn main() {
|
|||||||
SeqStart(2),
|
SeqStart(2),
|
||||||
Int(1),
|
Int(1),
|
||||||
Int(2),
|
Int(2),
|
||||||
End
|
End,
|
||||||
);
|
);
|
||||||
let mut state = MyDeserializer::new(tokens.into_iter());
|
let mut state = MyDeserializer::new(tokens.into_iter());
|
||||||
|
|
||||||
@@ -279,7 +302,7 @@ fn main() {
|
|||||||
SeqStart(2),
|
SeqStart(2),
|
||||||
Int(1),
|
Int(1),
|
||||||
Int(2),
|
Int(2),
|
||||||
End
|
End,
|
||||||
);
|
);
|
||||||
let mut state = MyDeserializer::new(tokens.into_iter());
|
let mut state = MyDeserializer::new(tokens.into_iter());
|
||||||
|
|
||||||
@@ -292,7 +315,47 @@ fn main() {
|
|||||||
SeqStart(2),
|
SeqStart(2),
|
||||||
Int(1),
|
Int(1),
|
||||||
Int(2),
|
Int(2),
|
||||||
End
|
End,
|
||||||
|
);
|
||||||
|
let mut state = MyDeserializer::new(tokens.into_iter());
|
||||||
|
|
||||||
|
let v: Result<json::Value, Error> = Deserialize::deserialize(&mut state);
|
||||||
|
println!("{}", v);
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
let tokens = vec!(
|
||||||
|
Int(1),
|
||||||
|
);
|
||||||
|
let mut state = MyDeserializer::new(tokens.into_iter());
|
||||||
|
|
||||||
|
let v: Result<Option<int>, Error> = Deserialize::deserialize(&mut state);
|
||||||
|
println!("{}", v);
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
let tokens = vec!(
|
||||||
|
Null,
|
||||||
|
);
|
||||||
|
let mut state = MyDeserializer::new(tokens.into_iter());
|
||||||
|
|
||||||
|
let v: Result<Option<int>, Error> = Deserialize::deserialize(&mut state);
|
||||||
|
println!("{}", v);
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
let tokens = vec!(
|
||||||
|
Int(1),
|
||||||
|
);
|
||||||
|
let mut state = MyDeserializer::new(tokens.into_iter());
|
||||||
|
|
||||||
|
let v: Result<json::Value, Error> = Deserialize::deserialize(&mut state);
|
||||||
|
println!("{}", v);
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
let tokens = vec!(
|
||||||
|
Null,
|
||||||
);
|
);
|
||||||
let mut state = MyDeserializer::new(tokens.into_iter());
|
let mut state = MyDeserializer::new(tokens.into_iter());
|
||||||
|
|
||||||
|
|||||||
+100
-7
@@ -10,26 +10,56 @@ pub trait Deserialize<D, E> {
|
|||||||
pub trait Deserializer<E> {
|
pub trait Deserializer<E> {
|
||||||
fn visit<
|
fn visit<
|
||||||
R,
|
R,
|
||||||
V: Visitor<Self, R, E>
|
V: Visitor<Self, R, E>,
|
||||||
>(&mut self, visitor: &mut V) -> Result<R, E>;
|
>(&mut self, visitor: &mut V) -> Result<R, E>;
|
||||||
|
|
||||||
|
fn visit_option<
|
||||||
|
T: Deserialize<Self, E>,
|
||||||
|
>(&mut self) -> Result<Option<T>, E>;
|
||||||
|
|
||||||
fn syntax_error(&mut self) -> E;
|
fn syntax_error(&mut self) -> E;
|
||||||
|
|
||||||
fn end_of_stream_error(&mut self) -> E;
|
fn end_of_stream_error(&mut self) -> E;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait Visitor<D: Deserializer<E>, R, E> {
|
pub trait Visitor<D: Deserializer<E>, R, E> {
|
||||||
|
fn visit_null(&mut self, d: &mut D) -> Result<R, E> {
|
||||||
|
Err(d.syntax_error())
|
||||||
|
}
|
||||||
|
|
||||||
fn visit_int(&mut self, d: &mut D, _v: int) -> Result<R, E> {
|
fn visit_int(&mut self, d: &mut D, _v: int) -> Result<R, E> {
|
||||||
Err(d.syntax_error())
|
Err(d.syntax_error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
fn visit_option<
|
||||||
|
V: OptionVisitor<D, E>
|
||||||
|
>(&mut self, d: &mut D, _visitor: V) -> Result<R, E> {
|
||||||
|
Err(d.syntax_error())
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
fn visit_seq<
|
fn visit_seq<
|
||||||
V: SeqVisitor<D, E>
|
V: SeqVisitor<D, E>
|
||||||
>(&mut self, d: &mut D, _v: V) -> Result<R, E> {
|
>(&mut self, d: &mut D, _visitor: V) -> Result<R, E> {
|
||||||
Err(d.syntax_error())
|
Err(d.syntax_error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
pub trait OptionVisitor<D, R, T: Deserialize<D, E>, E> {
|
||||||
|
/*
|
||||||
|
fn next<
|
||||||
|
T: Deserialize<D, E>,
|
||||||
|
>(&mut self, d: &mut D) -> Option<Result<T, E>>;
|
||||||
|
*/
|
||||||
|
|
||||||
|
fn visit<
|
||||||
|
T: Deserialize<D, E>,
|
||||||
|
>(&mut self, d: &mut D) -> Result<Option<T>, E>;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
pub trait SeqVisitor<D, E> {
|
pub trait SeqVisitor<D, E> {
|
||||||
fn next<
|
fn next<
|
||||||
T: Deserialize<D, E>,
|
T: Deserialize<D, E>,
|
||||||
@@ -43,6 +73,27 @@ pub trait SeqVisitor<D, E> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
impl<
|
||||||
|
D: Deserializer<E>,
|
||||||
|
E,
|
||||||
|
> Deserialize<D, E> for () {
|
||||||
|
fn deserialize(d: &mut D) -> Result<(), E> {
|
||||||
|
struct Visitor;
|
||||||
|
|
||||||
|
impl<D: Deserializer<E>, E> self::Visitor<D, (), E> for Visitor {
|
||||||
|
fn visit_null(&mut self, _d: &mut D) -> Result<(), E> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
d.visit(&mut Visitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
D: Deserializer<E>,
|
D: Deserializer<E>,
|
||||||
E,
|
E,
|
||||||
@@ -60,6 +111,51 @@ impl<
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
impl<
|
||||||
|
T: Deserialize<D, E>,
|
||||||
|
D: Deserializer<E>,
|
||||||
|
E,
|
||||||
|
> Deserialize<D, E> for Option<T> {
|
||||||
|
fn deserialize(d: &mut D) -> Result<Option<T>, E> {
|
||||||
|
/*
|
||||||
|
struct Visitor;
|
||||||
|
|
||||||
|
impl<
|
||||||
|
R: Deserialize<D, E>,
|
||||||
|
D: Deserializer<E>,
|
||||||
|
E,
|
||||||
|
> self::OptionVisitor<D, E> for Visitor {
|
||||||
|
/*
|
||||||
|
fn visit_option<
|
||||||
|
V: OptionVisitor<D, E>,
|
||||||
|
>(&mut self, d: &mut D, mut visitor: V) -> Result<Option<R>, E> {
|
||||||
|
match visitor.next(d) {
|
||||||
|
Some(value) => {
|
||||||
|
Ok(Some(try!(value)))
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
fn visit<
|
||||||
|
T: Deserialize<D, E>,
|
||||||
|
>(&mut self, d: &mut D, value: Option<T>) -> Result<Option<T>, E> {
|
||||||
|
Ok(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
d.visit_option()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
T: Deserialize<D, E>,
|
T: Deserialize<D, E>,
|
||||||
D: Deserializer<E>,
|
D: Deserializer<E>,
|
||||||
@@ -81,11 +177,8 @@ impl<
|
|||||||
|
|
||||||
loop {
|
loop {
|
||||||
match visitor.next(d) {
|
match visitor.next(d) {
|
||||||
Some(Ok(value)) => {
|
Some(value) => {
|
||||||
values.push(value);
|
values.push(try!(value));
|
||||||
}
|
|
||||||
Some(Err(err)) => {
|
|
||||||
return Err(err);
|
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user