| /// The type corresponding to the {{ non_canonical_name }} service. |
| {{ self.doc_string(service.attributes) -}} |
| {% if self.emit_debug_impls() -%} |
| #[derive(Debug)] |
| {%- endif %} |
| pub struct {{ service_name }}; |
| |
| impl ::fidl_next::DiscoverableService for {{ service_name }} { |
| const SERVICE_NAME: &'static str = "{{ self.service_name() }}"; |
| const MEMBER_NAMES: &'static [&'static str] = &[ |
| {% for member in service.members %} |
| "{{ member.name.non_canonical() }}", |
| {% endfor %} |
| ]; |
| } |
| |
| {% for transport in self.member_transports() %} |
| impl ::fidl_next::HasServiceRequest<{{ transport }}> for {{ service_name }} {} |
| {% endfor %} |
| |
| impl<___C> ::fidl_next::Service<___C> for {{ service_name }} |
| where |
| {% for member in service.members %} |
| ___C: ::fidl_next::protocol::ServiceConnector< |
| {{ self.member_transport(member) }} |
| >, |
| {% endfor %} |
| { |
| type Connector = {{ connector_name }}<___C>; |
| } |
| |
| /// A strongly-typed service connector for the `{{ non_canonical_name }}` service. |
| #[repr(transparent)] |
| pub struct {{ connector_name }}<___C> { |
| #[allow(dead_code)] |
| connector: ___C, |
| } |
| |
| impl<___C> {{ connector_name }}<___C> |
| where |
| {% for member in service.members %} |
| ___C: ::fidl_next::protocol::ServiceConnector< |
| {{ self.member_transport(member) }} |
| >, |
| {% endfor %} |
| { |
| {% for member in service.members %} |
| /// Attempts to connect to the `{{ member.name.non_canonical() }}` service member. |
| pub fn {{ member.name|snake }}( |
| &self, |
| server_end: ::fidl_next::ServerEnd< |
| {{ self.natural_id(self.member_protocol(member)) }}, |
| {{ self.member_transport(member) }}, |
| >, |
| ) -> ::core::result::Result< |
| (), |
| <___C as ::fidl_next::protocol::ServiceConnector< |
| {{ self.member_transport(member) }} |
| >>::Error, |
| > { |
| ::fidl_next::protocol::ServiceConnector::< |
| {{ self.member_transport(member) }} |
| >::connect_to_member( |
| &self.connector, |
| "{{ member.name.non_canonical() }}", |
| server_end.into_untyped(), |
| ) |
| } |
| {% endfor %} |
| } |
| |
| /// A service handler for the `{{ non_canonical_name }}` service. |
| pub trait {{ handler_name }} { |
| {% for member in service.members %} |
| /// Handles an attempt to connect to the `{{ member.name.non_canonical() }}` member. |
| fn {{ member.name|snake }}( |
| &self, |
| server_end: ::fidl_next::ServerEnd<{{ self.natural_id(self.member_protocol(member)) }}, {{ self.member_transport(member) }}>, |
| ); |
| {% endfor %} |
| } |
| |
| impl<___H, ___T> ::fidl_next::DispatchServiceHandler<___H, ___T> for {{ service_name }} |
| where |
| ___H: {{ handler_name }}, |
| {% for member in service.members %} |
| {{ self.member_transport(member) }}: ::fidl_next::InstanceFromServiceTransport<___T>, |
| {% endfor %} |
| { |
| fn on_connection( |
| handler: &___H, |
| member: &str, |
| server_end: ___T, |
| ) { |
| use ::fidl_next::InstanceFromServiceTransport; |
| match member { |
| {% for member in service.members %} |
| "{{ member.name.non_canonical() }}" => handler.{{ member.name|snake }}( |
| ::fidl_next::ServerEnd::from_untyped({{ self.member_transport(member) }}::from_service_transport(server_end)), |
| ), |
| {% endfor %} |
| _ => unreachable!(), |
| } |
| } |
| } |