@@ -452,7 +452,14 @@ impl quote::ToTokens for ObjectFieldTokenizer<'_> {
452452}
453453
454454fn quote_field_docs ( reporter : & Reporter , field : & ObjectField ) -> TokenStream {
455- let lines = doc_as_lines ( reporter, & field. virtpath , & field. fqname , & field. docs ) ;
455+ let require_example = false ;
456+ let lines = doc_as_lines (
457+ reporter,
458+ & field. virtpath ,
459+ & field. fqname ,
460+ & field. docs ,
461+ require_example,
462+ ) ;
456463
457464 let require_field_docs = false ;
458465 if require_field_docs && lines. is_empty ( ) && !field. is_testing ( ) {
@@ -463,7 +470,14 @@ fn quote_field_docs(reporter: &Reporter, field: &ObjectField) -> TokenStream {
463470}
464471
465472fn quote_obj_docs ( reporter : & Reporter , obj : & Object ) -> TokenStream {
466- let mut lines = doc_as_lines ( reporter, & obj. virtpath , & obj. fqname , & obj. docs ) ;
473+ let require_example = obj. kind == ObjectKind :: Archetype ;
474+ let mut lines = doc_as_lines (
475+ reporter,
476+ & obj. virtpath ,
477+ & obj. fqname ,
478+ & obj. docs ,
479+ require_example,
480+ ) ;
467481
468482 // Prefix first line with `**Datatype**: ` etc:
469483 if let Some ( first) = lines. first_mut ( ) {
@@ -475,14 +489,24 @@ fn quote_obj_docs(reporter: &Reporter, obj: &Object) -> TokenStream {
475489 quote_doc_lines ( & lines)
476490}
477491
478- fn doc_as_lines ( reporter : & Reporter , virtpath : & str , fqname : & str , docs : & Docs ) -> Vec < String > {
492+ fn doc_as_lines (
493+ reporter : & Reporter ,
494+ virtpath : & str ,
495+ fqname : & str ,
496+ docs : & Docs ,
497+ require_example : bool ,
498+ ) -> Vec < String > {
479499 let mut lines = crate :: codegen:: get_documentation ( docs, & [ "rs" , "rust" ] ) ;
480500
481501 let examples = collect_examples_for_api_docs ( docs, "rs" , true )
482502 . map_err ( |err| reporter. error ( virtpath, fqname, err) )
483503 . unwrap_or_default ( ) ;
484504
485- if !examples. is_empty ( ) {
505+ if examples. is_empty ( ) {
506+ if require_example {
507+ reporter. warn ( virtpath, fqname, "Missing example" ) ;
508+ }
509+ } else {
486510 lines. push ( Default :: default ( ) ) ;
487511 let section_title = if examples. len ( ) == 1 {
488512 "Example"
@@ -497,14 +521,27 @@ fn doc_as_lines(reporter: &Reporter, virtpath: &str, fqname: &str, docs: &Docs)
497521 name, title, image, ..
498522 } = & example. base ;
499523
524+ for line in & example. lines {
525+ if line. contains ( "```" ) {
526+ reporter. error (
527+ virtpath,
528+ fqname,
529+ format ! ( "Example {name:?} contains ``` in it, so we can't embed it in the Rust API docs." ) ,
530+ ) ;
531+ continue ;
532+ }
533+ }
534+
500535 if let Some ( title) = title {
501536 lines. push ( format ! ( "### {title}" ) ) ;
502537 } else {
503538 lines. push ( format ! ( "### `{name}`:" ) ) ;
504539 }
540+
505541 lines. push ( "```ignore" . into ( ) ) ;
506542 lines. extend ( example. lines . into_iter ( ) ) ;
507543 lines. push ( "```" . into ( ) ) ;
544+
508545 if let Some ( image) = & image {
509546 lines. extend ( image. image_stack ( ) . into_iter ( ) ) ;
510547 }
0 commit comments