blob: 8ec42f283f614c92c9e9f0330d395b1f0bffbfa3 [file] [log] [blame]
/// 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!(),
}
}
}