use macro_tools ::
{
Result,
AttributeComponent,
AttributePropertyComponent,
AttributePropertyOptionalBoolean,
AttributePropertyOptionalSyn,
AttributePropertyOptionalSingletone,
proc_macro2 ::TokenStream,
syn, return_syn_err, syn_err, qt
};
use component_model_types :: { Assign, OptionExt };
#[ derive( Debug, Default, Clone ) ] pub struct FieldAttributes
{
pub config: Option< AttributeConfig >,
pub scalar: Option< AttributeScalarSetter >,
pub subform_scalar: Option< AttributeSubformScalarSetter >,
pub subform_collection: Option< AttributeSubformCollectionSetter >,
pub subform_entry: Option< AttributeSubformEntrySetter >,
pub former_ignore: AttributePropertyFormerIgnore,
pub arg_for_constructor: AttributePropertyArgForConstructor,
}
impl FieldAttributes
{
pub fn from_attrs< 'a >(attrs: impl Iterator< Item = &'a syn ::Attribute >) -> Result< Self >
{
let mut result = Self ::default();
let known_attributes = format!(
"Known field attributes are: debug, {}, {}, {}, {}, {}, {}.",
AttributeConfig ::KEYWORD,
AttributeScalarSetter ::KEYWORD,
AttributeSubformScalarSetter ::KEYWORD,
AttributeSubformCollectionSetter ::KEYWORD,
AttributeSubformEntrySetter ::KEYWORD,
AttributePropertyFormerIgnore ::KEYWORD
);
let error = |attr: &syn ::Attribute| -> syn ::Error {
syn_err!(
attr,
"Expects an attribute of format `#[ attribute( key1 = val1, key2 = val2 ) ]`\n {known_attributes}\n But got: \n `{}`",
qt! { #attr }
)
};
for attr in attrs
{
let key_ident = attr.path().get_ident().ok_or_else(|| error(attr))?;
let key_str = format!("{key_ident}");
match key_str.as_ref()
{
AttributeConfig ::KEYWORD => result.assign(AttributeConfig ::from_meta(attr)?),
AttributeScalarSetter ::KEYWORD => result.assign(AttributeScalarSetter ::from_meta(attr)?),
AttributeSubformScalarSetter ::KEYWORD => result.assign(AttributeSubformScalarSetter ::from_meta(attr)?),
AttributeSubformCollectionSetter ::KEYWORD => result.assign(AttributeSubformCollectionSetter ::from_meta(attr)?),
AttributeSubformEntrySetter ::KEYWORD => result.assign(AttributeSubformEntrySetter ::from_meta(attr)?),
AttributePropertyFormerIgnore ::KEYWORD => result.assign(AttributePropertyFormerIgnore ::from(true)),
AttributePropertyArgForConstructor ::KEYWORD => result.assign(AttributePropertyArgForConstructor ::from(true)),
_ => {} }
}
Ok(result)
}
}
impl< IntoT > Assign< AttributeConfig, IntoT > for FieldAttributes
where
IntoT: Into< AttributeConfig >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component: AttributeConfig = component.into();
self.config.option_assign(component);
}
}
impl< IntoT > Assign< AttributeScalarSetter, IntoT > for FieldAttributes
where
IntoT: Into< AttributeScalarSetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component = component.into();
self.scalar.option_assign(component);
}
}
impl< IntoT > Assign< AttributeSubformScalarSetter, IntoT > for FieldAttributes
where
IntoT: Into< AttributeSubformScalarSetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component = component.into();
self.subform_scalar.option_assign(component);
}
}
impl< IntoT > Assign< AttributeSubformCollectionSetter, IntoT > for FieldAttributes
where
IntoT: Into< AttributeSubformCollectionSetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component = component.into();
self.subform_collection.option_assign(component);
}
}
impl< IntoT > Assign< AttributeSubformEntrySetter, IntoT > for FieldAttributes
where
IntoT: Into< AttributeSubformEntrySetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component = component.into();
self.subform_entry.option_assign(component);
}
}
impl< IntoT > Assign< AttributePropertyFormerIgnore, IntoT > for FieldAttributes
where
IntoT: Into< AttributePropertyFormerIgnore >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component = component.into();
self.former_ignore.assign(component);
}
}
impl< IntoT > Assign< AttributePropertyArgForConstructor, IntoT > for FieldAttributes
where
IntoT: Into< AttributePropertyArgForConstructor >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component = component.into();
self.arg_for_constructor.assign(component);
}
}
#[ derive( Debug, Default, Clone ) ] pub struct AttributeConfig
{
pub default: AttributePropertyDefault,
}
impl AttributeComponent for AttributeConfig
{
const KEYWORD: &'static str = "former";
#[ allow( clippy ::match_wildcard_for_single_variants ) ]
fn from_meta(attr: &syn ::Attribute) -> Result< Self >
{
match attr.meta
{
syn ::Meta ::List(ref meta_list) => syn ::parse2 :: < AttributeConfig >(meta_list.tokens.clone()),
syn ::Meta ::Path(ref _path) => syn ::parse2 :: < AttributeConfig >(TokenStream ::default()),
_ => return_syn_err!(
attr,
"Expects an attribute of format #[ former( default = 13 ) ].\nGot: {}",
qt! { #attr }
),
}
}
}
impl< IntoT > Assign< AttributeConfig, IntoT > for AttributeConfig
where
IntoT: Into< AttributeConfig >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component = component.into();
self.default.assign(component.default);
}
}
impl< IntoT > Assign< AttributePropertyDefault, IntoT > for AttributeConfig
where
IntoT: Into< AttributePropertyDefault >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.default.assign(component.into());
}
}
impl syn ::parse ::Parse for AttributeConfig
{
fn parse(input: syn ::parse ::ParseStream< '_ >) -> syn ::Result< Self >
{
let mut result = Self ::default();
let error = |ident: &syn ::Ident| -> syn ::Error {
let known = format!(
"Known entries of attribute {} are: {}.",
AttributeConfig ::KEYWORD,
DefaultMarker ::KEYWORD );
syn_err!(
ident,
r"Expects an attribute of format '#[ former( default = 13 ) ]'
{known}
But got: '{}'
",
qt! { #ident }
)
};
while !input.is_empty()
{
let lookahead = input.lookahead1();
if lookahead.peek(syn ::Ident)
{
let ident: syn ::Ident = input.parse()?;
match ident.to_string().as_str()
{
DefaultMarker ::KEYWORD => result.assign(AttributePropertyDefault ::parse(input)?),
_ => return Err(error(&ident)),
}
} else {
return Err(lookahead.error());
}
if input.peek(syn ::Token![ , ])
{
input.parse :: < syn ::Token![ , ] >()?;
}
}
Ok(result)
}
}
#[ derive( Debug, Default, Clone ) ] pub struct AttributeScalarSetter
{
pub name: AttributePropertyName,
pub setter: AttributePropertySetter,
pub debug: AttributePropertyDebug,
}
impl AttributeScalarSetter
{
#[ allow( dead_code ) ]
pub fn setter( &self ) -> bool
{
self.setter.unwrap_or(true)
}
}
impl AttributeComponent for AttributeScalarSetter
{
const KEYWORD: &'static str = "scalar";
#[ allow( clippy ::match_wildcard_for_single_variants ) ]
fn from_meta(attr: &syn ::Attribute) -> Result< Self >
{
match attr.meta
{
syn ::Meta ::List( ref meta_list ) =>
{
syn ::parse2 :: < AttributeScalarSetter >( meta_list.tokens.clone() )
},
syn ::Meta ::Path( ref _path ) =>
{
syn ::parse2 :: < AttributeScalarSetter >( TokenStream ::default() )
},
_ => return_syn_err!( attr, "Expects an attribute of format `#[ scalar( setter = false ) ]` or `#[ scalar( setter = true, name = my_name ) ]`. \nGot: {}", qt!{ #attr } ),
}
}
}
impl< IntoT > Assign< AttributeScalarSetter, IntoT > for AttributeScalarSetter
where
IntoT: Into< AttributeScalarSetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component = component.into();
self.name.assign(component.name);
self.setter.assign(component.setter);
self.debug.assign(component.debug);
}
}
impl< IntoT > Assign< AttributePropertyName, IntoT > for AttributeScalarSetter
where
IntoT: Into< AttributePropertyName >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.name = component.into();
}
}
impl< IntoT > Assign< AttributePropertySetter, IntoT > for AttributeScalarSetter
where
IntoT: Into< AttributePropertySetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.setter = component.into();
}
}
impl< IntoT > Assign< AttributePropertyDebug, IntoT > for AttributeScalarSetter
where
IntoT: Into< AttributePropertyDebug >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.debug = component.into();
}
}
impl syn ::parse ::Parse for AttributeScalarSetter
{
fn parse(input: syn ::parse ::ParseStream< '_ >) -> syn ::Result< Self >
{
let mut result = Self ::default();
let error = |ident: &syn ::Ident| -> syn ::Error {
let known = format!(
"Known entries of attribute {} are: {}, {}, {}.",
AttributeScalarSetter ::KEYWORD,
AttributePropertyName ::KEYWORD,
AttributePropertySetter ::KEYWORD,
AttributePropertyDebug ::KEYWORD
);
syn_err!(
ident,
r"Expects an attribute of format '#[ scalar( name = myName, setter = true ) ]'
{known}
But got: '{}'
",
qt! { #ident }
)
};
while !input.is_empty()
{
let lookahead = input.lookahead1();
if lookahead.peek(syn ::Ident)
{
let ident: syn ::Ident = input.parse()?;
match ident.to_string().as_str()
{
AttributePropertyName ::KEYWORD => result.assign(AttributePropertyName ::parse(input)?),
AttributePropertySetter ::KEYWORD => result.assign(AttributePropertySetter ::parse(input)?),
AttributePropertyDebug ::KEYWORD => result.assign(AttributePropertyDebug ::from(true)),
_ => return Err(error(&ident)),
}
} else {
return Err(lookahead.error());
}
if input.peek(syn ::Token![ , ])
{
input.parse :: < syn ::Token![ , ] >()?;
}
}
Ok(result)
}
}
#[ derive( Debug, Default, Clone ) ] pub struct AttributeSubformScalarSetter
{
pub name: AttributePropertyName,
pub setter: AttributePropertySetter,
pub debug: AttributePropertyDebug,
}
impl AttributeSubformScalarSetter
{
pub fn setter( &self ) -> bool
{
self.setter.unwrap_or(true)
}
}
impl AttributeComponent for AttributeSubformScalarSetter
{
const KEYWORD: &'static str = "subform_scalar";
#[ allow( clippy ::match_wildcard_for_single_variants ) ]
fn from_meta(attr: &syn ::Attribute) -> Result< Self >
{
match attr.meta
{
syn ::Meta ::List( ref meta_list ) =>
{
syn ::parse2 :: < AttributeSubformScalarSetter >( meta_list.tokens.clone() )
},
syn ::Meta ::Path( ref _path ) =>
{
syn ::parse2 :: < AttributeSubformScalarSetter >( TokenStream ::default() )
},
_ => return_syn_err!( attr, "Expects an attribute of format `#[ subform_scalar( setter = false ) ]` or `#[ subform_scalar( setter = true, name = my_name ) ]`. \nGot: {}", qt!{ #attr } ),
}
}
}
impl< IntoT > Assign< AttributeSubformScalarSetter, IntoT > for AttributeSubformScalarSetter
where
IntoT: Into< AttributeSubformScalarSetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component = component.into();
self.name.assign(component.name);
self.setter.assign(component.setter);
self.debug.assign(component.debug);
}
}
impl< IntoT > Assign< AttributePropertyName, IntoT > for AttributeSubformScalarSetter
where
IntoT: Into< AttributePropertyName >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.name = component.into();
}
}
impl< IntoT > Assign< AttributePropertySetter, IntoT > for AttributeSubformScalarSetter
where
IntoT: Into< AttributePropertySetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.setter = component.into();
}
}
impl< IntoT > Assign< AttributePropertyDebug, IntoT > for AttributeSubformScalarSetter
where
IntoT: Into< AttributePropertyDebug >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.debug = component.into();
}
}
impl syn ::parse ::Parse for AttributeSubformScalarSetter
{
fn parse(input: syn ::parse ::ParseStream< '_ >) -> syn ::Result< Self >
{
let mut result = Self ::default();
let error = |ident: &syn ::Ident| -> syn ::Error {
let known = format!(
"Known entries of attribute {} are: {}, {}, {}.",
AttributeSubformScalarSetter ::KEYWORD,
AttributePropertyName ::KEYWORD,
AttributePropertySetter ::KEYWORD,
AttributePropertyDebug ::KEYWORD
);
syn_err!(
ident,
r"Expects an attribute of format '#[ subform_scalar( name = myName, setter = true ) ]'
{known}
But got: '{}'
",
qt! { #ident }
)
};
while !input.is_empty()
{
let lookahead = input.lookahead1();
if lookahead.peek(syn ::Ident)
{
let ident: syn ::Ident = input.parse()?;
match ident.to_string().as_str()
{
AttributePropertyName ::KEYWORD => result.assign(AttributePropertyName ::parse(input)?),
AttributePropertySetter ::KEYWORD => result.assign(AttributePropertySetter ::parse(input)?),
AttributePropertyDebug ::KEYWORD => result.assign(AttributePropertyDebug ::from(true)),
_ => return Err(error(&ident)),
}
} else {
return Err(lookahead.error());
}
if input.peek(syn ::Token![ , ])
{
input.parse :: < syn ::Token![ , ] >()?;
}
}
Ok(result)
}
}
#[ derive( Debug, Default, Clone ) ] pub struct AttributeSubformCollectionSetter
{
pub name: AttributePropertyName,
pub setter: AttributePropertySetter,
pub debug: AttributePropertyDebug,
pub definition: AttributePropertyDefinition,
}
impl AttributeSubformCollectionSetter
{
pub fn setter( &self ) -> bool
{
self.setter.unwrap_or(true)
}
}
impl AttributeComponent for AttributeSubformCollectionSetter
{
const KEYWORD: &'static str = "subform_collection";
#[ allow( clippy ::match_wildcard_for_single_variants ) ]
fn from_meta(attr: &syn ::Attribute) -> Result< Self >
{
match attr.meta
{
syn ::Meta ::List( ref meta_list ) =>
{
syn ::parse2 :: < AttributeSubformCollectionSetter >( meta_list.tokens.clone() )
},
syn ::Meta ::Path( ref _path ) =>
{
syn ::parse2 :: < AttributeSubformCollectionSetter >( TokenStream ::default() )
},
_ => return_syn_err!( attr, "Expects an attribute of format `#[ subform_collection ]` or `#[ subform_collection( definition = former ::VectorDefinition ) ]` if you want to use default collection defition. \nGot: { }", qt!{ #attr } ),
}
}
}
impl< IntoT > Assign< AttributeSubformCollectionSetter, IntoT > for AttributeSubformCollectionSetter
where
IntoT: Into< AttributeSubformCollectionSetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component = component.into();
self.name.assign(component.name);
self.setter.assign(component.setter);
self.debug.assign(component.debug);
self.definition.assign(component.definition);
}
}
impl< IntoT > Assign< AttributePropertyName, IntoT > for AttributeSubformCollectionSetter
where
IntoT: Into< AttributePropertyName >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.name = component.into();
}
}
impl< IntoT > Assign< AttributePropertySetter, IntoT > for AttributeSubformCollectionSetter
where
IntoT: Into< AttributePropertySetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.setter = component.into();
}
}
impl< IntoT > Assign< AttributePropertyDefinition, IntoT > for AttributeSubformCollectionSetter
where
IntoT: Into< AttributePropertyDefinition >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.definition = component.into();
}
}
impl< IntoT > Assign< AttributePropertyDebug, IntoT > for AttributeSubformCollectionSetter
where
IntoT: Into< AttributePropertyDebug >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.debug = component.into();
}
}
impl syn ::parse ::Parse for AttributeSubformCollectionSetter
{
fn parse(input: syn ::parse ::ParseStream< '_ >) -> syn ::Result< Self >
{
let mut result = Self ::default();
let error = |ident: &syn ::Ident| -> syn ::Error {
let known = format!(
"Known entries of attribute {} are: {}, {}, {}, {}.",
AttributeSubformCollectionSetter ::KEYWORD,
AttributePropertyName ::KEYWORD,
AttributePropertySetter ::KEYWORD,
AttributePropertyDebug ::KEYWORD,
DefinitionMarker ::KEYWORD );
syn_err!(
ident,
r"Expects an attribute of format '#[ subform_collection( name = myName, setter = true, debug, definition = MyDefinition ) ]'
{known}
But got: '{}'
",
qt! { #ident }
)
};
while !input.is_empty()
{
let lookahead = input.lookahead1();
if lookahead.peek(syn ::Ident)
{
let ident: syn ::Ident = input.parse()?;
match ident.to_string().as_str()
{
AttributePropertyName ::KEYWORD => result.assign(AttributePropertyName ::parse(input)?),
AttributePropertySetter ::KEYWORD => result.assign(AttributePropertySetter ::parse(input)?),
AttributePropertyDebug ::KEYWORD => result.assign(AttributePropertyDebug ::from(true)),
DefinitionMarker ::KEYWORD => result.assign(AttributePropertyDefinition ::parse(input)?),
_ => return Err(error(&ident)),
}
} else {
return Err(lookahead.error());
}
if input.peek(syn ::Token![ , ])
{
input.parse :: < syn ::Token![ , ] >()?;
}
}
Ok(result)
}
}
#[ derive( Debug, Default, Clone ) ] pub struct AttributeSubformEntrySetter
{
pub name: AttributePropertyName,
pub setter: AttributePropertySetter,
pub debug: AttributePropertyDebug,
}
impl AttributeSubformEntrySetter
{
pub fn setter( &self ) -> bool
{
self.setter.unwrap_or(true)
}
}
impl AttributeComponent for AttributeSubformEntrySetter
{
const KEYWORD: &'static str = "subform_entry";
#[ allow( clippy ::match_wildcard_for_single_variants ) ]
fn from_meta(attr: &syn ::Attribute) -> Result< Self >
{
match attr.meta
{
syn ::Meta ::List(ref meta_list) => syn ::parse2 :: < AttributeSubformEntrySetter >(meta_list.tokens.clone()),
syn ::Meta ::Path(ref _path) => syn ::parse2 :: < AttributeSubformEntrySetter >(TokenStream ::default()),
_ => return_syn_err!(
attr,
"Expects an attribute of format `#[ subform_entry ]` or `#[ subform_entry( name: child )` ], \nGot: {}",
qt! { #attr }
),
}
}
}
impl< IntoT > Assign< AttributeSubformEntrySetter, IntoT > for AttributeSubformEntrySetter
where
IntoT: Into< AttributeSubformEntrySetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
let component = component.into();
self.name.assign(component.name);
self.setter.assign(component.setter);
self.debug.assign(component.debug);
}
}
impl< IntoT > Assign< AttributePropertyName, IntoT > for AttributeSubformEntrySetter
where
IntoT: Into< AttributePropertyName >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.name = component.into();
}
}
impl< IntoT > Assign< AttributePropertySetter, IntoT > for AttributeSubformEntrySetter
where
IntoT: Into< AttributePropertySetter >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.setter = component.into();
}
}
impl< IntoT > Assign< AttributePropertyDebug, IntoT > for AttributeSubformEntrySetter
where
IntoT: Into< AttributePropertyDebug >,
{
#[ inline( always ) ]
fn assign(&mut self, component: IntoT)
{
self.debug = component.into();
}
}
impl syn ::parse ::Parse for AttributeSubformEntrySetter
{
fn parse(input: syn ::parse ::ParseStream< '_ >) -> syn ::Result< Self >
{
let mut result = Self ::default();
let error = |ident: &syn ::Ident| -> syn ::Error {
let known = format!(
"Known entries of attribute {} are: {}, {}, {}.",
AttributeSubformEntrySetter ::KEYWORD,
AttributePropertyName ::KEYWORD,
AttributePropertySetter ::KEYWORD,
AttributePropertyDebug ::KEYWORD
);
syn_err!(
ident,
r"Expects an attribute of format '#[ subform( name = myName, setter = true ) ]'
{known}
But got: '{}'
",
qt! { #ident }
)
};
while !input.is_empty()
{
let lookahead = input.lookahead1();
if lookahead.peek(syn ::Ident)
{
let ident: syn ::Ident = input.parse()?;
match ident.to_string().as_str()
{
AttributePropertyName ::KEYWORD => result.assign(AttributePropertyName ::parse(input)?),
AttributePropertySetter ::KEYWORD => result.assign(AttributePropertySetter ::parse(input)?),
AttributePropertyDebug ::KEYWORD => result.assign(AttributePropertyDebug ::from(true)),
_ => return Err(error(&ident)),
}
} else {
return Err(lookahead.error());
}
if input.peek(syn ::Token![ , ])
{
input.parse :: < syn ::Token![ , ] >()?;
}
}
Ok(result)
}
}
#[ derive( Debug, Default, Clone, Copy ) ] pub struct DebugMarker;
impl AttributePropertyComponent for DebugMarker
{
const KEYWORD: &'static str = "debug";
}
pub type AttributePropertyDebug = AttributePropertyOptionalSingletone< DebugMarker >;
#[ derive( Debug, Default, Clone, Copy ) ] pub struct SetterMarker;
impl AttributePropertyComponent for SetterMarker
{
const KEYWORD: &'static str = "setter";
}
pub type AttributePropertySetter = AttributePropertyOptionalBoolean< SetterMarker >;
#[ derive( Debug, Default, Clone, Copy ) ] pub struct NameMarker;
impl AttributePropertyComponent for NameMarker
{
const KEYWORD: &'static str = "name";
}
pub type AttributePropertyName = AttributePropertyOptionalSyn< syn ::Ident, NameMarker >;
#[ derive( Debug, Default, Clone, Copy ) ] pub struct DefaultMarker;
impl AttributePropertyComponent for DefaultMarker
{
const KEYWORD: &'static str = "default";
}
pub type AttributePropertyDefault = AttributePropertyOptionalSyn< syn ::Expr, DefaultMarker >;
#[ derive( Debug, Default, Clone, Copy ) ] pub struct DefinitionMarker;
impl AttributePropertyComponent for DefinitionMarker
{
const KEYWORD: &'static str = "definition";
}
pub type AttributePropertyDefinition = AttributePropertyOptionalSyn< syn ::Type, DefinitionMarker >;
#[ derive( Debug, Default, Clone, Copy ) ] pub struct FormerIgnoreMarker;
impl AttributePropertyComponent for FormerIgnoreMarker
{
const KEYWORD: &'static str = "former_ignore";
}
pub type AttributePropertyFormerIgnore = AttributePropertyOptionalSingletone< FormerIgnoreMarker >;
#[ derive( Debug, Default, Clone, Copy ) ]
pub struct ArgForConstructorMarker;
impl AttributePropertyComponent for ArgForConstructorMarker
{
const KEYWORD: &'static str = "arg_for_constructor";
}
pub type AttributePropertyArgForConstructor = AttributePropertyOptionalSingletone< ArgForConstructorMarker >;