blob: 3a1d05f43295a1d1c0be6796941d303b8d75eeba [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package codegen
const serviceTmpl = `
{{- define "ServiceDeclaration" -}}
{{- $service := . }}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct {{ $service.Name }}Marker;
#[cfg(target_os = "fuchsia")]
impl fidl::endpoints::UnifiedServiceMarker for {{ $service.Name }}Marker {
type Proxy = {{ $service.Name }}Proxy;
type Request = {{ $service.Name }}Request;
const SERVICE_NAME: &'static str = "{{ $service.ServiceName }}";
}
/// A request for one of the member protocols of {{ $service.Name }}.
///
{{- range $service.DocComments }}
///{{ . }}
{{- end }}
#[cfg(target_os = "fuchsia")]
pub enum {{ $service.Name }}Request {
{{- range $member := $service.Members }}
{{- range $member.DocComments }}
///{{ . }}
{{- end }}
{{ $member.CamelName }}({{ $member.ProtocolType }}RequestStream),
{{- end}}
}
#[cfg(target_os = "fuchsia")]
impl fidl::endpoints::UnifiedServiceRequest for {{ $service.Name }}Request {
type Service = {{ $service.Name }}Marker;
fn dispatch(name: &str, _channel: fidl::AsyncChannel) -> Self {
match name {
{{- range $member := $service.Members }}
"{{ $member.Name }}" => Self::{{ $member.CamelName }}(
<{{ $member.ProtocolType }}RequestStream as fidl::endpoints::RequestStream>::from_channel(_channel),
),
{{- end }}
_ => panic!("no such member protocol name for service {{ $service.Name }}"),
}
}
fn member_names() -> &'static [&'static str] {
&[
{{- range $member := $service.Members }}
"{{ $member.Name }}",
{{- end }}
]
}
}
{{- range $service.DocComments }}
///{{ . }}
{{- end }}
#[cfg(target_os = "fuchsia")]
pub struct {{ $service.Name }}Proxy(Box<dyn fidl::endpoints::MemberOpener>);
#[cfg(target_os = "fuchsia")]
impl fidl::endpoints::UnifiedServiceProxy for {{ $service.Name }}Proxy {
type Service = {{ $service.Name }}Marker;
fn from_member_opener(opener: Box<dyn fidl::endpoints::MemberOpener>) -> Self {
Self(opener)
}
}
#[cfg(target_os = "fuchsia")]
impl {{ $service.Name }}Proxy {
{{- range $member := $service.Members }}
{{- range $member.DocComments }}
///{{ . }}
{{- end }}
pub fn {{ $member.SnakeName }}(&self) -> Result<{{ $member.ProtocolType }}Proxy, fidl::Error> {
let (proxy, server) = zx::Channel::create().map_err(fidl::Error::ChannelPairCreate)?;
self.0.open_member("{{ $member.Name }}", server)?;
let proxy = fidl::AsyncChannel::from_channel(proxy).map_err(fidl::Error::AsyncChannel)?;
Ok({{ $member.ProtocolType }}Proxy::new(proxy))
}
{{- end }}
}
{{- end }}
`