Generate rustdocs from .proto file comments (#10)
* generate rustdoc comments from .proto file comments * move imports to top of file
This commit is contained in:
committed by
Lucio Franco
parent
646796f248
commit
36d0b1cb04
@@ -1,3 +1,4 @@
|
|||||||
|
use crate::generate_doc_comments;
|
||||||
use proc_macro2::TokenStream;
|
use proc_macro2::TokenStream;
|
||||||
use prost_build::{Method, Service};
|
use prost_build::{Method, Service};
|
||||||
use quote::{format_ident, quote};
|
use quote::{format_ident, quote};
|
||||||
@@ -8,8 +9,10 @@ pub(crate) fn generate(service: &Service, proto: &str) -> TokenStream {
|
|||||||
let methods = generate_methods(service, proto);
|
let methods = generate_methods(service, proto);
|
||||||
|
|
||||||
let connect = generate_connect(&service_ident);
|
let connect = generate_connect(&service_ident);
|
||||||
|
let service_doc = generate_doc_comments(&service.comments.leading);
|
||||||
|
|
||||||
quote! {
|
quote! {
|
||||||
|
#service_doc
|
||||||
pub struct #service_ident<T> {
|
pub struct #service_ident<T> {
|
||||||
inner: tonic::client::Grpc<T>,
|
inner: tonic::client::Grpc<T>,
|
||||||
}
|
}
|
||||||
@@ -75,6 +78,8 @@ fn generate_methods(service: &Service, proto: &str) -> TokenStream {
|
|||||||
service.package, service.proto_name, method.proto_name
|
service.package, service.proto_name, method.proto_name
|
||||||
);
|
);
|
||||||
|
|
||||||
|
stream.extend(generate_doc_comments(&method.comments.leading));
|
||||||
|
|
||||||
let method = match (method.client_streaming, method.server_streaming) {
|
let method = match (method.client_streaming, method.server_streaming) {
|
||||||
(false, false) => generate_unary(method, &proto, path),
|
(false, false) => generate_unary(method, &proto, path),
|
||||||
(false, true) => generate_server_streaming(method, &proto, path),
|
(false, true) => generate_server_streaming(method, &proto, path),
|
||||||
|
|||||||
+27
-1
@@ -25,8 +25,9 @@
|
|||||||
//! }
|
//! }
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use proc_macro2::TokenStream;
|
use proc_macro2::{TokenStream, Delimiter, Group, Ident, Literal, Punct, Spacing, Span};
|
||||||
use prost_build::Config;
|
use prost_build::Config;
|
||||||
|
use quote::TokenStreamExt;
|
||||||
|
|
||||||
#[cfg(feature = "rustfmt")]
|
#[cfg(feature = "rustfmt")]
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
@@ -199,3 +200,28 @@ impl prost_build::ServiceGenerator for ServiceGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Generate a singular line of a doc comment
|
||||||
|
fn generate_doc_comment(comment: &str, stream: &mut TokenStream) {
|
||||||
|
let mut doc_stream = TokenStream::new();
|
||||||
|
|
||||||
|
doc_stream.append(Ident::new("doc", Span::call_site()));
|
||||||
|
doc_stream.append(Punct::new('=', Spacing::Alone));
|
||||||
|
doc_stream.append(Literal::string(&comment));
|
||||||
|
|
||||||
|
let group = Group::new(Delimiter::Bracket, doc_stream);
|
||||||
|
|
||||||
|
stream.append(Punct::new('#', Spacing::Alone));
|
||||||
|
stream.append(group);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate a larger doc comment composed of many lines of doc comments
|
||||||
|
fn generate_doc_comments<T: AsRef<str>>(comments: &[T]) -> TokenStream {
|
||||||
|
let mut stream = TokenStream::new();
|
||||||
|
|
||||||
|
for comment in comments {
|
||||||
|
generate_doc_comment(comment.as_ref(), &mut stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
stream
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use crate::generate_doc_comments;
|
||||||
use proc_macro2::{Span, TokenStream};
|
use proc_macro2::{Span, TokenStream};
|
||||||
use prost_build::{Method, Service};
|
use prost_build::{Method, Service};
|
||||||
use quote::quote;
|
use quote::quote;
|
||||||
@@ -10,10 +11,12 @@ pub(crate) fn generate(service: &Service, proto_path: &str) -> TokenStream {
|
|||||||
let server_service = quote::format_ident!("{}ServerSvc", service.name);
|
let server_service = quote::format_ident!("{}ServerSvc", service.name);
|
||||||
let server_trait = quote::format_ident!("{}", service.name);
|
let server_trait = quote::format_ident!("{}", service.name);
|
||||||
let generated_trait = generate_trait(service, proto_path, server_trait.clone());
|
let generated_trait = generate_trait(service, proto_path, server_trait.clone());
|
||||||
|
let service_doc = generate_doc_comments(&service.comments.leading);
|
||||||
|
|
||||||
quote! {
|
quote! {
|
||||||
#generated_trait
|
#generated_trait
|
||||||
|
|
||||||
|
#service_doc
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct #server_make_service<T: #server_trait> {
|
pub struct #server_make_service<T: #server_trait> {
|
||||||
inner: Arc<T>,
|
inner: Arc<T>,
|
||||||
|
|||||||
Reference in New Issue
Block a user