@@ -55,6 +55,7 @@ pub(crate) enum ParsedField {
5555 Regular {
5656 pat_ident : PatIdent ,
5757 name : Option < LitStr > ,
58+ description : String ,
5859 ty : Type ,
5960 exposed : bool ,
6061 value_source : ValueSource ,
@@ -66,6 +67,7 @@ pub(crate) enum ParsedField {
6667 Node {
6768 pat_ident : PatIdent ,
6869 name : Option < LitStr > ,
70+ description : String ,
6971 input_type : Type ,
7072 output_type : Type ,
7173 implementations : Punctuated < Implementation , Comma > ,
@@ -383,6 +385,21 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
383385 }
384386
385387 let ( is_node, node_input_type, node_output_type) = parse_node_type ( & ty) ;
388+ let description = attrs
389+ . iter ( )
390+ . filter_map ( |a| {
391+ if a. style != AttrStyle :: Outer {
392+ return None ;
393+ }
394+ let Meta :: NameValue ( name_val) = & a. meta else { return None } ;
395+ if name_val. path . get_ident ( ) . map ( |x| x. to_string ( ) ) != Some ( "doc" . into ( ) ) {
396+ return None ;
397+ }
398+ let Expr :: Lit ( expr_lit) = & name_val. value else { return None } ;
399+ let Lit :: Str ( ref text) = expr_lit. lit else { return None } ;
400+ Some ( text. value ( ) . trim ( ) . to_string ( ) )
401+ } )
402+ . fold ( String :: new ( ) , |acc, b| acc + & b + "\n " ) ;
386403
387404 if is_node {
388405 let ( input_type, output_type) = node_input_type
@@ -399,6 +416,7 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
399416 Ok ( ParsedField :: Node {
400417 pat_ident,
401418 name,
419+ description,
402420 input_type,
403421 output_type,
404422 implementations,
@@ -411,6 +429,7 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
411429 Ok ( ParsedField :: Regular {
412430 pat_ident,
413431 name,
432+ description,
414433 exposed,
415434 number_min,
416435 number_max,
@@ -599,6 +618,7 @@ mod tests {
599618 fields : vec ! [ ParsedField :: Regular {
600619 pat_ident: pat_ident( "b" ) ,
601620 name: None ,
621+ description: String :: new( ) ,
602622 ty: parse_quote!( f64 ) ,
603623 exposed: false ,
604624 value_source: ValueSource :: None ,
@@ -652,13 +672,15 @@ mod tests {
652672 ParsedField :: Node {
653673 pat_ident: pat_ident( "transform_target" ) ,
654674 name: None ,
675+ description: String :: new( ) ,
655676 input_type: parse_quote!( Footprint ) ,
656677 output_type: parse_quote!( T ) ,
657678 implementations: Punctuated :: new( ) ,
658679 } ,
659680 ParsedField :: Regular {
660681 pat_ident: pat_ident( "translate" ) ,
661682 name: None ,
683+ description: String :: new( ) ,
662684 ty: parse_quote!( DVec2 ) ,
663685 exposed: false ,
664686 value_source: ValueSource :: None ,
@@ -709,6 +731,7 @@ mod tests {
709731 fields : vec ! [ ParsedField :: Regular {
710732 pat_ident: pat_ident( "radius" ) ,
711733 name: None ,
734+ description: String :: new( ) ,
712735 ty: parse_quote!( f64 ) ,
713736 exposed: false ,
714737 value_source: ValueSource :: Default ( quote!( 50. ) ) ,
@@ -757,6 +780,7 @@ mod tests {
757780 fields : vec ! [ ParsedField :: Regular {
758781 pat_ident: pat_ident( "shadows" ) ,
759782 name: None ,
783+ description: String :: new( ) ,
760784 ty: parse_quote!( f64 ) ,
761785 exposed: false ,
762786 value_source: ValueSource :: None ,
@@ -784,6 +808,7 @@ mod tests {
784808 let input = quote ! (
785809 fn add(
786810 a: f64 ,
811+ /// b
787812 #[ range( ( 0. , 100. ) ) ]
788813 #[ min( -500. ) ]
789814 #[ max( 500. ) ]
@@ -816,6 +841,7 @@ mod tests {
816841 fields : vec ! [ ParsedField :: Regular {
817842 pat_ident: pat_ident( "b" ) ,
818843 name: None ,
844+ description: String :: from( "b" ) ,
819845 ty: parse_quote!( f64 ) ,
820846 exposed: false ,
821847 value_source: ValueSource :: None ,
@@ -865,6 +891,7 @@ mod tests {
865891 pat_ident: pat_ident( "path" ) ,
866892 name: None ,
867893 ty: parse_quote!( String ) ,
894+ description: String :: new( ) ,
868895 exposed: true ,
869896 value_source: ValueSource :: None ,
870897 number_min: None ,
0 commit comments