mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-07-21 14:25:44 +00:00
serde List -> Array
This commit is contained in:
+24
-24
@@ -13,31 +13,31 @@ use std::str::StrAllocating;
|
|||||||
|
|
||||||
use json::value::{ToJson, Value};
|
use json::value::{ToJson, Value};
|
||||||
|
|
||||||
pub struct ListBuilder {
|
pub struct ArrayBuilder {
|
||||||
list: Vec<Value>,
|
array: Vec<Value>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ListBuilder {
|
impl ArrayBuilder {
|
||||||
pub fn new() -> ListBuilder {
|
pub fn new() -> ArrayBuilder {
|
||||||
ListBuilder { list: Vec::new() }
|
ArrayBuilder { array: Vec::new() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn unwrap(self) -> Value {
|
pub fn unwrap(self) -> Value {
|
||||||
Value::List(self.list)
|
Value::Array(self.array)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn push<T: ToJson>(self, value: T) -> ListBuilder {
|
pub fn push<T: ToJson>(self, value: T) -> ArrayBuilder {
|
||||||
let mut builder = self;
|
let mut builder = self;
|
||||||
builder.list.push(value.to_json());
|
builder.array.push(value.to_json());
|
||||||
builder
|
builder
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn push_list(self, f: |ListBuilder| -> ListBuilder) -> ListBuilder {
|
pub fn push_array(self, f: |ArrayBuilder| -> ArrayBuilder) -> ArrayBuilder {
|
||||||
let builder = ListBuilder::new();
|
let builder = ArrayBuilder::new();
|
||||||
self.push(f(builder).unwrap())
|
self.push(f(builder).unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn push_object(self, f: |ObjectBuilder| -> ObjectBuilder) -> ListBuilder {
|
pub fn push_object(self, f: |ObjectBuilder| -> ObjectBuilder) -> ArrayBuilder {
|
||||||
let builder = ObjectBuilder::new();
|
let builder = ObjectBuilder::new();
|
||||||
self.push(f(builder).unwrap())
|
self.push(f(builder).unwrap())
|
||||||
}
|
}
|
||||||
@@ -62,8 +62,8 @@ impl ObjectBuilder {
|
|||||||
builder
|
builder
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert_list<S: StrAllocating>(self, key: S, f: |ListBuilder| -> ListBuilder) -> ObjectBuilder {
|
pub fn insert_array<S: StrAllocating>(self, key: S, f: |ArrayBuilder| -> ArrayBuilder) -> ObjectBuilder {
|
||||||
let builder = ListBuilder::new();
|
let builder = ArrayBuilder::new();
|
||||||
self.insert(key.into_string(), f(builder).unwrap())
|
self.insert(key.into_string(), f(builder).unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,26 +78,26 @@ mod tests {
|
|||||||
use std::collections::TreeMap;
|
use std::collections::TreeMap;
|
||||||
|
|
||||||
use json::value::Value;
|
use json::value::Value;
|
||||||
use super::{ListBuilder, ObjectBuilder};
|
use super::{ArrayBuilder, ObjectBuilder};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_list_builder() {
|
fn test_array_builder() {
|
||||||
let value = ListBuilder::new().unwrap();
|
let value = ArrayBuilder::new().unwrap();
|
||||||
assert_eq!(value, Value::List(Vec::new()));
|
assert_eq!(value, Value::Array(Vec::new()));
|
||||||
|
|
||||||
let value = ListBuilder::new()
|
let value = ArrayBuilder::new()
|
||||||
.push(1i)
|
.push(1i)
|
||||||
.push(2i)
|
.push(2i)
|
||||||
.push(3i)
|
.push(3i)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(value, Value::List(vec!(Value::Integer(1), Value::Integer(2), Value::Integer(3))));
|
assert_eq!(value, Value::Array(vec!(Value::Integer(1), Value::Integer(2), Value::Integer(3))));
|
||||||
|
|
||||||
let value = ListBuilder::new()
|
let value = ArrayBuilder::new()
|
||||||
.push_list(|bld| bld.push(1i).push(2i).push(3i))
|
.push_array(|bld| bld.push(1i).push(2i).push(3i))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(value, Value::List(vec!(Value::List(vec!(Value::Integer(1), Value::Integer(2), Value::Integer(3))))));
|
assert_eq!(value, Value::Array(vec!(Value::Array(vec!(Value::Integer(1), Value::Integer(2), Value::Integer(3))))));
|
||||||
|
|
||||||
let value = ListBuilder::new()
|
let value = ArrayBuilder::new()
|
||||||
.push_object(|bld|
|
.push_object(|bld|
|
||||||
bld
|
bld
|
||||||
.insert("a".to_string(), 1i)
|
.insert("a".to_string(), 1i)
|
||||||
@@ -107,7 +107,7 @@ mod tests {
|
|||||||
let mut map = TreeMap::new();
|
let mut map = TreeMap::new();
|
||||||
map.insert("a".to_string(), Value::Integer(1));
|
map.insert("a".to_string(), Value::Integer(1));
|
||||||
map.insert("b".to_string(), Value::Integer(2));
|
map.insert("b".to_string(), Value::Integer(2));
|
||||||
assert_eq!(value, Value::List(vec!(Value::Object(map))));
|
assert_eq!(value, Value::Array(vec!(Value::Object(map))));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
+1
-1
@@ -292,7 +292,7 @@ fn main() {
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pub use self::builder::{ListBuilder, ObjectBuilder};
|
pub use self::builder::{ArrayBuilder, ObjectBuilder};
|
||||||
pub use self::de::{
|
pub use self::de::{
|
||||||
Parser,
|
Parser,
|
||||||
from_str,
|
from_str,
|
||||||
|
|||||||
+22
-22
@@ -21,7 +21,7 @@ pub enum Value {
|
|||||||
Integer(i64),
|
Integer(i64),
|
||||||
Floating(f64),
|
Floating(f64),
|
||||||
String(string::String),
|
String(string::String),
|
||||||
List(Vec<Value>),
|
Array(Vec<Value>),
|
||||||
Object(TreeMap<string::String, Value>),
|
Object(TreeMap<string::String, Value>),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,16 +107,16 @@ impl Value {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if the Json value is a List. Returns false otherwise.
|
/// Returns true if the Json value is a Array. Returns false otherwise.
|
||||||
pub fn is_list<'a>(&'a self) -> bool {
|
pub fn is_array<'a>(&'a self) -> bool {
|
||||||
self.as_list().is_some()
|
self.as_array().is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If the Json value is a List, returns the associated vector.
|
/// If the Json value is a Array, returns the associated vector.
|
||||||
/// Returns None otherwise.
|
/// Returns None otherwise.
|
||||||
pub fn as_list<'a>(&'a self) -> Option<&'a Vec<Value>> {
|
pub fn as_array<'a>(&'a self) -> Option<&'a Vec<Value>> {
|
||||||
match *self {
|
match *self {
|
||||||
Value::List(ref list) => Some(list),
|
Value::Array(ref array) => Some(array),
|
||||||
_ => None
|
_ => None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -243,7 +243,7 @@ impl<S: ser::Serializer<E>, E> ser::Serialize<S, E> for Value {
|
|||||||
Value::String(ref v) => {
|
Value::String(ref v) => {
|
||||||
v.serialize(s)
|
v.serialize(s)
|
||||||
}
|
}
|
||||||
Value::List(ref v) => {
|
Value::Array(ref v) => {
|
||||||
v.serialize(s)
|
v.serialize(s)
|
||||||
}
|
}
|
||||||
Value::Object(ref v) => {
|
Value::Object(ref v) => {
|
||||||
@@ -277,8 +277,8 @@ impl<D: de::Deserializer<E>, E> de::Deserialize<D, E> for Value {
|
|||||||
Token::Option(false) => Ok(Value::Null),
|
Token::Option(false) => Ok(Value::Null),
|
||||||
Token::Option(true) => de::Deserialize::deserialize(d),
|
Token::Option(true) => de::Deserialize::deserialize(d),
|
||||||
Token::TupleStart(_) | Token::SeqStart(_) => {
|
Token::TupleStart(_) | Token::SeqStart(_) => {
|
||||||
let list = try!(de::Deserialize::deserialize_token(d, token));
|
let array = try!(de::Deserialize::deserialize_token(d, token));
|
||||||
Ok(Value::List(list))
|
Ok(Value::Array(array))
|
||||||
}
|
}
|
||||||
Token::StructStart(_, _) | Token::MapStart(_) => {
|
Token::StructStart(_, _) | Token::MapStart(_) => {
|
||||||
let object = try!(de::Deserialize::deserialize_token(d, token));
|
let object = try!(de::Deserialize::deserialize_token(d, token));
|
||||||
@@ -288,7 +288,7 @@ impl<D: de::Deserializer<E>, E> de::Deserialize<D, E> for Value {
|
|||||||
let token = Token::SeqStart(len);
|
let token = Token::SeqStart(len);
|
||||||
let fields: Vec<Value> = try!(de::Deserialize::deserialize_token(d, token));
|
let fields: Vec<Value> = try!(de::Deserialize::deserialize_token(d, token));
|
||||||
let mut object = TreeMap::new();
|
let mut object = TreeMap::new();
|
||||||
object.insert(name.to_string(), Value::List(fields));
|
object.insert(name.to_string(), Value::Array(fields));
|
||||||
Ok(Value::Object(object))
|
Ok(Value::Object(object))
|
||||||
}
|
}
|
||||||
Token::End => {
|
Token::End => {
|
||||||
@@ -303,7 +303,7 @@ impl<D: de::Deserializer<E>, E> de::Deserialize<D, E> for Value {
|
|||||||
|
|
||||||
enum State {
|
enum State {
|
||||||
Value(Value),
|
Value(Value),
|
||||||
List(vec::MoveItems<Value>),
|
Array(vec::MoveItems<Value>),
|
||||||
Object(tree_map::MoveEntries<string::String, Value>),
|
Object(tree_map::MoveEntries<string::String, Value>),
|
||||||
End,
|
End,
|
||||||
}
|
}
|
||||||
@@ -333,9 +333,9 @@ impl Iterator<Result<Token, Error>> for Deserializer {
|
|||||||
Value::Integer(x) => Token::I64(x),
|
Value::Integer(x) => Token::I64(x),
|
||||||
Value::Floating(x) => Token::F64(x),
|
Value::Floating(x) => Token::F64(x),
|
||||||
Value::String(x) => Token::String(x),
|
Value::String(x) => Token::String(x),
|
||||||
Value::List(x) => {
|
Value::Array(x) => {
|
||||||
let len = x.len();
|
let len = x.len();
|
||||||
self.stack.push(State::List(x.into_iter()));
|
self.stack.push(State::Array(x.into_iter()));
|
||||||
Token::SeqStart(len)
|
Token::SeqStart(len)
|
||||||
}
|
}
|
||||||
Value::Object(x) => {
|
Value::Object(x) => {
|
||||||
@@ -347,10 +347,10 @@ impl Iterator<Result<Token, Error>> for Deserializer {
|
|||||||
|
|
||||||
return Some(Ok(token));
|
return Some(Ok(token));
|
||||||
}
|
}
|
||||||
Some(State::List(mut iter)) => {
|
Some(State::Array(mut iter)) => {
|
||||||
match iter.next() {
|
match iter.next() {
|
||||||
Some(value) => {
|
Some(value) => {
|
||||||
self.stack.push(State::List(iter));
|
self.stack.push(State::Array(iter));
|
||||||
self.stack.push(State::Value(value));
|
self.stack.push(State::Value(value));
|
||||||
// loop around.
|
// loop around.
|
||||||
}
|
}
|
||||||
@@ -441,11 +441,11 @@ impl de::Deserializer<Error> for Deserializer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let (variant, fields) = match iter.next() {
|
let (variant, fields) = match iter.next() {
|
||||||
Some((variant, Value::List(fields))) => (variant, fields),
|
Some((variant, Value::Array(fields))) => (variant, fields),
|
||||||
Some((key, value)) => {
|
Some((key, value)) => {
|
||||||
return Err(
|
return Err(
|
||||||
Error::ExpectedError(
|
Error::ExpectedError(
|
||||||
"List".to_string(),
|
"Array".to_string(),
|
||||||
format!("{} => {}", key, value)
|
format!("{} => {}", key, value)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -608,12 +608,12 @@ macro_rules! impl_to_json_tuple {
|
|||||||
|
|
||||||
let ($(ref $name,)*) = *self;
|
let ($(ref $name,)*) = *self;
|
||||||
|
|
||||||
let mut list = Vec::with_capacity(len);
|
let mut array = Vec::with_capacity(len);
|
||||||
$(
|
$(
|
||||||
list.push($name.to_json());
|
array.push($name.to_json());
|
||||||
)*
|
)*
|
||||||
|
|
||||||
Value::List(list)
|
Value::Array(array)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
peel_to_json_tuple!($($name,)*)
|
peel_to_json_tuple!($($name,)*)
|
||||||
@@ -624,7 +624,7 @@ impl_to_json_tuple! { T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, }
|
|||||||
|
|
||||||
impl<A:ToJson> ToJson for Vec<A> {
|
impl<A:ToJson> ToJson for Vec<A> {
|
||||||
fn to_json(&self) -> Value {
|
fn to_json(&self) -> Value {
|
||||||
Value::List(self.iter().map(|elt| elt.to_json()).collect())
|
Value::Array(self.iter().map(|elt| elt.to_json()).collect())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user