support Option type value
This commit is contained in:
@@ -66,6 +66,10 @@ pub fn parse(
|
||||
#[allow(unused_mut)]
|
||||
let mut #field_label : #struct_name = #struct_name::default();
|
||||
}),
|
||||
Some(FieldType::FieldTypeOption { .. }) => Some(quote!{
|
||||
#[allow(unused_mut)]
|
||||
let mut #field_label = None;
|
||||
}),
|
||||
Some(FieldType::FieldTypeVec { data_type }) => {
|
||||
let dt = Box::into_raw(data_type);
|
||||
match unsafe { dt.as_ref() } {
|
||||
@@ -109,7 +113,8 @@ pub fn parse(
|
||||
#[allow(unused_mut)]
|
||||
let mut #field_label : Vec<#struct_name> = vec![];
|
||||
}),
|
||||
Some(&FieldType::FieldTypeVec { .. }) => {
|
||||
Some(&FieldType::FieldTypeOption { .. })
|
||||
| Some(&FieldType::FieldTypeVec { .. }) => {
|
||||
unimplemented!();
|
||||
}
|
||||
None => {
|
||||
|
||||
@@ -62,6 +62,10 @@ pub fn parse(
|
||||
#[allow(unused_mut, non_snake_case, non_camel_case_types)]
|
||||
let mut #label : #struct_name = #struct_name::default();
|
||||
}),
|
||||
Some(FieldType::FieldTypeOption { .. }) => Some(quote!{
|
||||
#[allow(unused_mut, non_snake_case, non_camel_case_types)]
|
||||
let mut #label = None;
|
||||
}),
|
||||
Some(FieldType::FieldTypeVec { data_type }) => {
|
||||
let dt = Box::into_raw(data_type);
|
||||
match unsafe { dt.as_ref() } {
|
||||
@@ -105,7 +109,7 @@ pub fn parse(
|
||||
#[allow(unused_mut)]
|
||||
let mut #label : Vec<#struct_name> = vec![];
|
||||
}),
|
||||
Some(&FieldType::FieldTypeVec { .. }) => {
|
||||
Some(&FieldType::FieldTypeOption { .. }) | Some(&FieldType::FieldTypeVec { .. }) => {
|
||||
unimplemented!();
|
||||
}
|
||||
None => {
|
||||
@@ -194,6 +198,50 @@ pub fn parse(
|
||||
}
|
||||
})
|
||||
}
|
||||
Some(FieldType::FieldTypeOption { data_type }) => {
|
||||
let dt = Box::into_raw(data_type);
|
||||
match unsafe { dt.as_ref() } {
|
||||
Some(&FieldType::FieldTypeString) => {
|
||||
build_declare_visitor("e!{String}, "e!{visit_str}, &visitor_label)
|
||||
}
|
||||
Some(&FieldType::FieldTypeBool) => {
|
||||
build_declare_visitor("e!{bool}, "e!{visit_bool}, &visitor_label)
|
||||
}
|
||||
Some(&FieldType::FieldTypeI8) => {
|
||||
build_declare_visitor("e!{i8}, "e!{visit_i8}, &visitor_label)
|
||||
}
|
||||
Some(&FieldType::FieldTypeU8) => {
|
||||
build_declare_visitor("e!{u8}, "e!{visit_u8}, &visitor_label)
|
||||
}
|
||||
Some(&FieldType::FieldTypeI16) => {
|
||||
build_declare_visitor("e!{i16}, "e!{visit_i16}, &visitor_label)
|
||||
}
|
||||
Some(&FieldType::FieldTypeU16) => {
|
||||
build_declare_visitor("e!{u16}, "e!{visit_u16}, &visitor_label)
|
||||
}
|
||||
Some(&FieldType::FieldTypeI32) => {
|
||||
build_declare_visitor("e!{i32}, "e!{visit_i32}, &visitor_label)
|
||||
}
|
||||
Some(&FieldType::FieldTypeU32) => {
|
||||
build_declare_visitor("e!{u32}, "e!{visit_u32}, &visitor_label)
|
||||
}
|
||||
Some(&FieldType::FieldTypeI64) => {
|
||||
build_declare_visitor("e!{i64}, "e!{visit_i64}, &visitor_label)
|
||||
}
|
||||
Some(&FieldType::FieldTypeU64) => {
|
||||
build_declare_visitor("e!{u64}, "e!{visit_u64}, &visitor_label)
|
||||
}
|
||||
Some(&FieldType::FieldTypeF32) => {
|
||||
build_declare_visitor("e!{f32}, "e!{visit_f32}, &visitor_label)
|
||||
}
|
||||
Some(&FieldType::FieldTypeF64) => {
|
||||
build_declare_visitor("e!{f64}, "e!{visit_f64}, &visitor_label)
|
||||
}
|
||||
_ => {
|
||||
unimplemented!();
|
||||
}
|
||||
}
|
||||
}
|
||||
Some(FieldType::FieldTypeVec { data_type }) => {
|
||||
let dt = Box::into_raw(data_type);
|
||||
match unsafe { dt.as_ref() } {
|
||||
@@ -422,6 +470,144 @@ pub fn parse(
|
||||
}
|
||||
}
|
||||
}),
|
||||
Some(FieldType::FieldTypeOption { data_type }) => {
|
||||
let dt = Box::into_raw(data_type);
|
||||
match unsafe { dt.as_ref() } {
|
||||
Some(&FieldType::FieldTypeString) => {
|
||||
let visitor = Ident::new("visit_str", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{String},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
Some(&FieldType::FieldTypeBool) => {
|
||||
let visitor = Ident::new("visit_bool", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{bool},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
Some(&FieldType::FieldTypeU8) => {
|
||||
let visitor = Ident::new("visit_u8", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{u8},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
Some(&FieldType::FieldTypeI8) => {
|
||||
let visitor = Ident::new("visit_i8", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{i8},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
Some(&FieldType::FieldTypeU16) => {
|
||||
let visitor = Ident::new("visit_u16", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{u16},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
Some(&FieldType::FieldTypeI16) => {
|
||||
let visitor = Ident::new("visit_i16", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{i16},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
Some(&FieldType::FieldTypeU32) => {
|
||||
let visitor = Ident::new("visit_u32", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{u32},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
Some(&FieldType::FieldTypeI32) => {
|
||||
let visitor = Ident::new("visit_i32", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{i32},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
Some(&FieldType::FieldTypeU64) => {
|
||||
let visitor = Ident::new("visit_u64", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{u64},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
Some(&FieldType::FieldTypeI64) => {
|
||||
let visitor = Ident::new("visit_i64", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{i64},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
Some(&FieldType::FieldTypeF32) => {
|
||||
let visitor = Ident::new("visit_f32", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{f32},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
Some(&FieldType::FieldTypeF64) => {
|
||||
let visitor = Ident::new("visit_f64", Span::call_site());
|
||||
build_call_visitor(
|
||||
"e!{f64},
|
||||
&visitor,
|
||||
"e!{= Some(value)},
|
||||
&visitor_label,
|
||||
label,
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
Some(FieldType::FieldTypeVec { data_type }) => {
|
||||
let dt = Box::into_raw(data_type);
|
||||
match unsafe { dt.as_ref() } {
|
||||
@@ -613,40 +799,173 @@ pub fn parse(
|
||||
}
|
||||
}
|
||||
}),
|
||||
Some(FieldType::FieldTypeBool) => {
|
||||
build_call_visitor_for_attribute(label, &label_name, "e!{visit_bool}, &visitor_label)
|
||||
Some(FieldType::FieldTypeBool) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= value},
|
||||
"e!{visit_bool},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(FieldType::FieldTypeI8) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= value},
|
||||
"e!{visit_i8},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(FieldType::FieldTypeU8) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= value},
|
||||
"e!{visit_u8},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(FieldType::FieldTypeI16) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= value},
|
||||
"e!{visit_i16},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(FieldType::FieldTypeU16) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= value},
|
||||
"e!{visit_u16},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(FieldType::FieldTypeI32) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= value},
|
||||
"e!{visit_i32},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(FieldType::FieldTypeU32) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= value},
|
||||
"e!{visit_u32},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(FieldType::FieldTypeI64) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= value},
|
||||
"e!{visit_i64},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(FieldType::FieldTypeU64) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= value},
|
||||
"e!{visit_u64},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(FieldType::FieldTypeF32) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= value},
|
||||
"e!{visit_f32},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(FieldType::FieldTypeF64) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= value},
|
||||
"e!{visit_f64},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(FieldType::FieldTypeOption { data_type }) => {
|
||||
let dt = Box::into_raw(data_type);
|
||||
match unsafe { dt.as_ref() } {
|
||||
Some(&FieldType::FieldTypeString) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_str},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(&FieldType::FieldTypeBool) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_bool},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(&FieldType::FieldTypeU8) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_u8},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(&FieldType::FieldTypeI8) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_i8},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(&FieldType::FieldTypeU16) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_u16},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(&FieldType::FieldTypeI16) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_i16},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(&FieldType::FieldTypeU32) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_u32},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(&FieldType::FieldTypeI32) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_i32},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(&FieldType::FieldTypeU64) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_u64},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(&FieldType::FieldTypeI64) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_i64},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(&FieldType::FieldTypeF32) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_f32},
|
||||
&visitor_label,
|
||||
),
|
||||
Some(&FieldType::FieldTypeF64) => build_call_visitor_for_attribute(
|
||||
label,
|
||||
&label_name,
|
||||
"e!{= Some(value)},
|
||||
"e!{visit_f64},
|
||||
&visitor_label,
|
||||
),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
Some(FieldType::FieldTypeI8) => {
|
||||
build_call_visitor_for_attribute(label, &label_name, "e!{visit_i8}, &visitor_label)
|
||||
}
|
||||
Some(FieldType::FieldTypeU8) => {
|
||||
build_call_visitor_for_attribute(label, &label_name, "e!{visit_u8}, &visitor_label)
|
||||
}
|
||||
Some(FieldType::FieldTypeI16) => {
|
||||
build_call_visitor_for_attribute(label, &label_name, "e!{visit_i16}, &visitor_label)
|
||||
}
|
||||
Some(FieldType::FieldTypeU16) => {
|
||||
build_call_visitor_for_attribute(label, &label_name, "e!{visit_u16}, &visitor_label)
|
||||
}
|
||||
Some(FieldType::FieldTypeI32) => {
|
||||
build_call_visitor_for_attribute(label, &label_name, "e!{visit_i32}, &visitor_label)
|
||||
}
|
||||
Some(FieldType::FieldTypeU32) => {
|
||||
build_call_visitor_for_attribute(label, &label_name, "e!{visit_u32}, &visitor_label)
|
||||
}
|
||||
Some(FieldType::FieldTypeI64) => {
|
||||
build_call_visitor_for_attribute(label, &label_name, "e!{visit_i64}, &visitor_label)
|
||||
}
|
||||
Some(FieldType::FieldTypeU64) => {
|
||||
build_call_visitor_for_attribute(label, &label_name, "e!{visit_u64}, &visitor_label)
|
||||
}
|
||||
Some(FieldType::FieldTypeF32) => {
|
||||
build_call_visitor_for_attribute(label, &label_name, "e!{visit_f32}, &visitor_label)
|
||||
}
|
||||
Some(FieldType::FieldTypeF64) => {
|
||||
build_call_visitor_for_attribute(label, &label_name, "e!{visit_f64}, &visitor_label)
|
||||
}
|
||||
|
||||
Some(FieldType::FieldTypeStruct { struct_name }) => {
|
||||
let struct_ident = Ident::new(
|
||||
&format!("__Visitor_{}_{}", label_name, struct_name),
|
||||
@@ -742,9 +1061,10 @@ pub fn parse(
|
||||
"e!{f64::from_str(text_content).unwrap()},
|
||||
),
|
||||
|
||||
Some(FieldType::FieldTypeStruct { .. }) | Some(FieldType::FieldTypeVec { .. }) | None => {
|
||||
None
|
||||
}
|
||||
Some(FieldType::FieldTypeStruct { .. })
|
||||
| Some(FieldType::FieldTypeOption { .. })
|
||||
| Some(FieldType::FieldTypeVec { .. })
|
||||
| None => None,
|
||||
}
|
||||
})
|
||||
.filter(|x| x.is_some())
|
||||
@@ -900,6 +1220,7 @@ fn build_call_visitor(
|
||||
fn build_call_visitor_for_attribute(
|
||||
label: &Option<Ident>,
|
||||
label_name: &str,
|
||||
action: &TokenStream,
|
||||
visitor: &TokenStream,
|
||||
visitor_label: &Ident,
|
||||
) -> Option<TokenStream> {
|
||||
@@ -908,7 +1229,7 @@ fn build_call_visitor_for_attribute(
|
||||
if attr.name.local_name == #label_name {
|
||||
let visitor = #visitor_label{};
|
||||
match visitor.#visitor(&attr.value) {
|
||||
Ok(value) => {#label = value;}
|
||||
Ok(value) => {#label #action;}
|
||||
Err(msg) => {return Err(msg);}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user