diff options
| author | Philipp A | 2018-11-16 18:15:49 +0100 | 
|---|---|---|
| committer | Philipp A | 2018-11-16 18:15:49 +0100 | 
| commit | 0fa6ad2e25df27e281b04d51d2c64b5658dc8876 (patch) | |
| tree | a8c238e3e4eaef3356b9479bb3e8eb76eb3a1a5f /src/document_tree/elements.rs | |
| parent | 8f8270f4b4745087dcddba60b23d88d6f3fa4fb6 (diff) | |
| download | rust-rst-0fa6ad2e25df27e281b04d51d2c64b5658dc8876.tar.bz2 | |
WIP serialization
Diffstat (limited to 'src/document_tree/elements.rs')
| -rw-r--r-- | src/document_tree/elements.rs | 42 | 
1 files changed, 42 insertions, 0 deletions
| diff --git a/src/document_tree/elements.rs b/src/document_tree/elements.rs index ba5d78e..77efa34 100644 --- a/src/document_tree/elements.rs +++ b/src/document_tree/elements.rs @@ -1,4 +1,12 @@  use url::Url; +use serde::{ +    Serialize, +    Serializer, +    ser::{ +        SerializeSeq, +        SerializeStruct, +    }, +};  use super::extra_attributes::{self,ExtraAttributes};  use super::element_categories::*; @@ -72,26 +80,60 @@ macro_rules! impl_new {(  	}  )} +macro_rules! impl_serialize { +	($name: ident, $extra: ident, $childtype: ident) => { +		impl Serialize for $name { +			fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer { +				let mut state = serializer.serialize_struct(stringify!($name), 3)?; +				// TODO: common attrs +				impl_serialize_extra!($extra); +				impl_serialize_children!($childtype, self, serializer); +				state.end() +			} +		} +	}; +} + +macro_rules! impl_serialize_extra { +	(__) => {}; +	($name: ident) => { +		// TODO extra_attributes::$name +	}; +} + +macro_rules! impl_serialize_children { +	(__, $_: ident, $__: ident) => {}; +	($childtype: ident, $self: ident, $serializer: ident) => { +		use serde::ser::SerializeStruct; +		$serializer.serialize_field("children", $self.children()); +	}; +} +  macro_rules! impl_elem {  	($name:ident) => {  		impl_new!(#[derive(Default,Debug)] pub struct $name { common: CommonAttributes });  		impl_element!($name); +		impl_serialize!($name, __, __);  	};  	($name:ident; +) => {  		impl_new!(#[derive(Default,Debug)] pub struct $name { common: CommonAttributes, extra: extra_attributes::$name });  		impl_element!($name); impl_extra!($name); +		impl_serialize!($name, $name, __);  	};  	($name:ident; *) => { //same as above with no default  		impl_new!(#[derive(Debug)] pub struct $name { common: CommonAttributes, extra: extra_attributes::$name });  		impl_element!($name); impl_extra!($name); +		impl_serialize!($name, $name, __);  	};  	($name:ident, $childtype:ident) => {  		impl_new!(#[derive(Default,Debug)] pub struct $name { common: CommonAttributes, children: Vec<$childtype> });  		impl_element!($name); impl_children!($name, $childtype); +		impl_serialize!($name, __, $childtype);  	};  	($name:ident, $childtype:ident; +) => {  		impl_new!(#[derive(Default,Debug)] pub struct $name { common: CommonAttributes, extra: extra_attributes::$name, children: Vec<$childtype> });  		impl_element!($name); impl_extra!($name); impl_children!($name, $childtype); +		impl_serialize!($name, $name, $childtype);  	};  } | 
