Remove unneeded Option's and unsafe's

This commit is contained in:
Dmitry Samoylov 2020-02-04 17:50:16 +07:00
parent 703a238d02
commit 5a0f0e55a7
2 changed files with 882 additions and 927 deletions

File diff suppressed because it is too large Load Diff

View File

@ -27,19 +27,19 @@ pub fn serialize(
let label_name = build_label_name(&field, &field_attrs);
match get_field_type(field) {
Some(FieldType::FieldTypeString)
| Some(FieldType::FieldTypeBool)
| Some(FieldType::FieldTypeI8)
| Some(FieldType::FieldTypeU8)
| Some(FieldType::FieldTypeI16)
| Some(FieldType::FieldTypeU16)
| Some(FieldType::FieldTypeI32)
| Some(FieldType::FieldTypeU32)
| Some(FieldType::FieldTypeI64)
| Some(FieldType::FieldTypeU64)
| Some(FieldType::FieldTypeF32)
| Some(FieldType::FieldTypeF64) => {
get_field_type(field).and_then(|field| match field {
FieldType::FieldTypeString
| FieldType::FieldTypeBool
| FieldType::FieldTypeI8
| FieldType::FieldTypeU8
| FieldType::FieldTypeI16
| FieldType::FieldTypeU16
| FieldType::FieldTypeI32
| FieldType::FieldTypeU32
| FieldType::FieldTypeI64
| FieldType::FieldTypeU64
| FieldType::FieldTypeF32
| FieldType::FieldTypeF64 => {
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
Some(quote! {
@ -72,71 +72,49 @@ pub fn serialize(
})
}
}
Some(FieldType::FieldTypeOption { data_type }) => {
let dt = Box::into_raw(data_type);
match unsafe { dt.as_ref() } {
Some(&FieldType::FieldTypeString) => {
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
Some(quote! {
let struct_start_event =
if self.#label != #default_function() {
if let Some(ref value) = self.#label {
struct_start_event.attr(#label_name, &value)
} else {
struct_start_event
}
} else {
struct_start_event
};
})
} else {
Some(quote! {
let struct_start_event =
FieldType::FieldTypeOption { data_type } => match *data_type {
FieldType::FieldTypeString => {
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
Some(quote! {
let struct_start_event =
if self.#label != #default_function() {
if let Some(ref value) = self.#label {
struct_start_event.attr(#label_name, &value)
} else {
struct_start_event
};
})
}
}
} else {
struct_start_event
};
})
} else {
Some(quote! {
let struct_start_event =
if let Some(ref value) = self.#label {
struct_start_event.attr(#label_name, &value)
} else {
struct_start_event
};
})
}
Some(&FieldType::FieldTypeBool)
| Some(&FieldType::FieldTypeI8)
| Some(&FieldType::FieldTypeU8)
| Some(&FieldType::FieldTypeI16)
| Some(&FieldType::FieldTypeU16)
| Some(&FieldType::FieldTypeI32)
| Some(&FieldType::FieldTypeU32)
| Some(&FieldType::FieldTypeI64)
| Some(&FieldType::FieldTypeU64)
| Some(&FieldType::FieldTypeF32)
| Some(&FieldType::FieldTypeF64) => {
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
Some(quote! {
let struct_start_event =
if self.#label != #default_function() {
if let Some(ref value) = self.#label {
struct_start_event.attr(#label_name, &*{
use std::mem;
unsafe {
let content = format!("{}", value);
let ret : &'static str = mem::transmute(&content as &str);
mem::forget(content);
ret
}
})
} else {
struct_start_event
}
} else {
struct_start_event
};
})
} else {
Some(quote! {
let struct_start_event =
}
FieldType::FieldTypeBool
| FieldType::FieldTypeI8
| FieldType::FieldTypeU8
| FieldType::FieldTypeI16
| FieldType::FieldTypeU16
| FieldType::FieldTypeI32
| FieldType::FieldTypeU32
| FieldType::FieldTypeI64
| FieldType::FieldTypeU64
| FieldType::FieldTypeF32
| FieldType::FieldTypeF64 => {
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
Some(quote! {
let struct_start_event =
if self.#label != #default_function() {
if let Some(ref value) = self.#label {
struct_start_event.attr(#label_name, &*{
use std::mem;
@ -149,38 +127,57 @@ pub fn serialize(
})
} else {
struct_start_event
};
})
}
}
Some(&FieldType::FieldTypeVec { .. }) => {
let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters(&item_ident, label_name);
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
Some(quote! {
if self.#label != #default_function() {
if let Some(ref yas_list) = self.#label {
for yas_item in yas_list.iter() {
#inner
}
} else {
struct_start_event
};
})
} else {
Some(quote! {
let struct_start_event =
if let Some(ref value) = self.#label {
struct_start_event.attr(#label_name, &*{
use std::mem;
unsafe {
let content = format!("{}", value);
let ret : &'static str = mem::transmute(&content as &str);
mem::forget(content);
ret
}
})
} else {
struct_start_event
};
})
}
}
FieldType::FieldTypeVec { .. } => {
let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters(&item_ident, label_name);
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
Some(quote! {
if self.#label != #default_function() {
if let Some(ref yas_list) = self.#label {
for yas_item in yas_list.iter() {
#inner
}
}
})
} else {
Some(quote! {
for yas_item in &self.#label {
#inner
}
})
}
}
})
} else {
Some(quote! {
for yas_item in &self.#label {
#inner
}
})
}
_ => unimplemented!(),
}
}
Some(FieldType::FieldTypeStruct { .. }) => {
_ => unimplemented!(),
},
FieldType::FieldTypeStruct { .. } => {
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
Some(quote! {
@ -222,7 +219,7 @@ pub fn serialize(
}
}
_ => None,
}
})
})
.filter_map(|x| x)
.collect();
@ -256,157 +253,145 @@ pub fn serialize(
let label_name = build_label_name(&field, &field_attrs);
match get_field_type(field) {
Some(FieldType::FieldTypeString)
| Some(FieldType::FieldTypeBool)
| Some(FieldType::FieldTypeI8)
| Some(FieldType::FieldTypeU8)
| Some(FieldType::FieldTypeI16)
| Some(FieldType::FieldTypeU16)
| Some(FieldType::FieldTypeI32)
| Some(FieldType::FieldTypeU32)
| Some(FieldType::FieldTypeI64)
| Some(FieldType::FieldTypeU64)
| Some(FieldType::FieldTypeF32)
| Some(FieldType::FieldTypeF64) => {
serialize_element(label, label_name, &field_attrs.default)
}
Some(FieldType::FieldTypeOption { data_type }) => {
let dt = Box::into_raw(data_type);
match unsafe { dt.as_ref() } {
Some(&FieldType::FieldTypeString)
| Some(&FieldType::FieldTypeBool)
| Some(&FieldType::FieldTypeI8)
| Some(&FieldType::FieldTypeU8)
| Some(&FieldType::FieldTypeI16)
| Some(&FieldType::FieldTypeU16)
| Some(&FieldType::FieldTypeI32)
| Some(&FieldType::FieldTypeU32)
| Some(&FieldType::FieldTypeI64)
| Some(&FieldType::FieldTypeU64)
| Some(&FieldType::FieldTypeF32)
| Some(&FieldType::FieldTypeF64) => {
let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
get_field_type(field).and_then(|field| match field {
FieldType::FieldTypeString
| FieldType::FieldTypeBool
| FieldType::FieldTypeI8
| FieldType::FieldTypeU8
| FieldType::FieldTypeI16
| FieldType::FieldTypeU16
| FieldType::FieldTypeI32
| FieldType::FieldTypeU32
| FieldType::FieldTypeI64
| FieldType::FieldTypeU64
| FieldType::FieldTypeF32
| FieldType::FieldTypeF64 => serialize_element(label, label_name, &field_attrs.default),
FieldType::FieldTypeOption { data_type } => match *data_type {
FieldType::FieldTypeString
| FieldType::FieldTypeBool
| FieldType::FieldTypeI8
| FieldType::FieldTypeU8
| FieldType::FieldTypeI16
| FieldType::FieldTypeU16
| FieldType::FieldTypeI32
| FieldType::FieldTypeU32
| FieldType::FieldTypeI64
| FieldType::FieldTypeU64
| FieldType::FieldTypeF32
| FieldType::FieldTypeF64 => {
let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
Some(quote! {
if self.#label != #default_function() {
if let Some(ref yas_item) = self.#label {
#inner
}
}
})
} else {
Some(quote! {
Some(quote! {
if self.#label != #default_function() {
if let Some(ref yas_item) = self.#label {
#inner
}
})
}
}
})
} else {
Some(quote! {
if let Some(ref yas_item) = self.#label {
#inner
}
})
}
Some(&FieldType::FieldTypeVec { .. }) => {
let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
}
FieldType::FieldTypeVec { .. } => {
let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
Some(quote! {
if self.#label != #default_function() {
if let Some(ref yas_items) = &self.#label {
for yas_item in yas_items.iter() {
#inner
}
}
}
})
} else {
Some(quote! {
Some(quote! {
if self.#label != #default_function() {
if let Some(ref yas_items) = &self.#label {
for yas_item in yas_items.iter() {
#inner
}
}
})
}
}
})
} else {
Some(quote! {
if let Some(ref yas_items) = &self.#label {
for yas_item in yas_items.iter() {
#inner
}
}
})
}
Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! {
if let Some(ref item) = &self.#label {
writer.set_start_event_name(Some(#label_name.to_string()));
writer.set_skip_start_end(false);
item.serialize(writer)?;
}
}),
_ => unimplemented!(),
}
}
Some(FieldType::FieldTypeStruct { .. }) => Some(quote! {
FieldType::FieldTypeStruct { .. } => Some(quote! {
if let Some(ref item) = &self.#label {
writer.set_start_event_name(Some(#label_name.to_string()));
writer.set_skip_start_end(false);
item.serialize(writer)?;
}
}),
_ => unimplemented!(),
},
FieldType::FieldTypeStruct { .. } => Some(quote! {
writer.set_start_event_name(Some(#label_name.to_string()));
writer.set_skip_start_end(false);
self.#label.serialize(writer)?;
}),
Some(FieldType::FieldTypeVec { data_type }) => {
let dt = Box::into_raw(data_type);
match unsafe { dt.as_ref() } {
Some(&FieldType::FieldTypeString) => {
let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
FieldType::FieldTypeVec { data_type } => match *data_type {
FieldType::FieldTypeString => {
let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
Some(quote! {
for yas_item in &self.#label {
#inner
}
})
}
Some(&FieldType::FieldTypeBool)
| Some(&FieldType::FieldTypeI8)
| Some(&FieldType::FieldTypeU8)
| Some(&FieldType::FieldTypeI16)
| Some(&FieldType::FieldTypeU16)
| Some(&FieldType::FieldTypeI32)
| Some(&FieldType::FieldTypeU32)
| Some(&FieldType::FieldTypeI64)
| Some(&FieldType::FieldTypeU64)
| Some(&FieldType::FieldTypeF32)
| Some(&FieldType::FieldTypeF64) => {
let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
Some(quote! {
for yas_item in &self.#label {
#inner
}
})
}
Some(&FieldType::FieldTypeOption { .. }) => Some(quote! {
for item in &self.#label {
if let Some(value) = item {
writer.set_start_event_name(None);
writer.set_skip_start_end(false);
value.serialize(writer)?;
}
Some(quote! {
for yas_item in &self.#label {
#inner
}
}),
Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! {
for item in &self.#label {
})
}
FieldType::FieldTypeBool
| FieldType::FieldTypeI8
| FieldType::FieldTypeU8
| FieldType::FieldTypeI16
| FieldType::FieldTypeU16
| FieldType::FieldTypeI32
| FieldType::FieldTypeU32
| FieldType::FieldTypeI64
| FieldType::FieldTypeU64
| FieldType::FieldTypeF32
| FieldType::FieldTypeF64 => {
let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
Some(quote! {
for yas_item in &self.#label {
#inner
}
})
}
FieldType::FieldTypeOption { .. } => Some(quote! {
for item in &self.#label {
if let Some(value) = item {
writer.set_start_event_name(None);
writer.set_skip_start_end(false);
item.serialize(writer)?;
value.serialize(writer)?;
}
}),
Some(&FieldType::FieldTypeVec { .. }) => {
unimplemented!();
}
None => {
unimplemented!();
}),
FieldType::FieldTypeStruct { .. } => Some(quote! {
for item in &self.#label {
writer.set_start_event_name(None);
writer.set_skip_start_end(false);
item.serialize(writer)?;
}
}),
FieldType::FieldTypeVec { .. } => {
unimplemented!();
}
}
None => None,
}
},
})
})
.filter_map(|x| x)
.collect();