diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden index 0bec6f5c3d696514fe631f8a552d96b9d008b3e4..b7ebb05fb5dd9f33b78aedd32e87892c2a0d6959 100644 --- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden +++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden @@ -30,11 +30,11 @@ fidl_enum! { } -type WithErrorSyntaxErrorAsPrimitiveResult = std::result::Result< WithErrorSyntaxErrorAsPrimitiveResponse , u32 >; - - -type WithErrorSyntaxErrorAsEnumResult = std::result::Result< WithErrorSyntaxErrorAsEnumResponse , ErrorEnun >; +type WithErrorSyntaxErrorAsPrimitiveResult = std::result::Result< ( +), u32 >; +type WithErrorSyntaxErrorAsEnumResult = std::result::Result< ( +), ErrorEnun >; fidl_empty_struct!( diff --git a/garnet/go/src/fidl/compiler/backend/rust/generator.go b/garnet/go/src/fidl/compiler/backend/rust/generator.go index 65ecbf6c10b335976bb42f1d51c8ec8e6b636974..fe1a6823311e22395ee0694650cdbce42a75616d 100644 --- a/garnet/go/src/fidl/compiler/backend/rust/generator.go +++ b/garnet/go/src/fidl/compiler/backend/rust/generator.go @@ -30,6 +30,7 @@ func NewFidlGenerator() *FidlGenerator { template.Must(tmpls.Parse(templates.XUnion)) template.Must(tmpls.Parse(templates.Union)) template.Must(tmpls.Parse(templates.Table)) + template.Must(tmpls.Parse(templates.Result)) return &FidlGenerator{ tmpls: tmpls, } diff --git a/garnet/go/src/fidl/compiler/backend/rust/ir/ir.go b/garnet/go/src/fidl/compiler/backend/rust/ir/ir.go index 199a99bfe2b840c9df2ae85cbe4151d803b4eb9a..5ad30054d32fc0842f72cc8ecc479d576f4cc147 100644 --- a/garnet/go/src/fidl/compiler/backend/rust/ir/ir.go +++ b/garnet/go/src/fidl/compiler/backend/rust/ir/ir.go @@ -67,6 +67,15 @@ type XUnionMember struct { Ordinal int } +type Result struct { + types.Attributes + Name string + Ok []string + Err UnionMember + Size int + Alignment int +} + type Union struct { types.Attributes Name string @@ -77,7 +86,7 @@ type Union struct { type UnionMember struct { types.Attributes - Type string + Type Type Name string Offset int } @@ -149,6 +158,7 @@ type Root struct { Structs []Struct XUnions []XUnion Unions []Union + Results []Result Tables []Table Interfaces []Interface } @@ -700,12 +710,37 @@ func (c *compiler) compileXUnion(val types.XUnion) XUnion { func (c *compiler) compileUnionMember(val types.UnionMember) UnionMember { return UnionMember{ Attributes: val.Attributes, - Type: c.compileType(val.Type, false).Decl, + Type: c.compileType(val.Type, false), Name: compileCamelIdentifier(val.Name), Offset: val.Offset, } } +func (c *compiler) compileResult(val types.Union, root Root) Result { + r := Result{ + Attributes: val.Attributes, + Name: c.compileCamelCompoundIdentifier(val.Name), + Ok: []string{}, + Err: c.compileUnionMember(val.Members[1]), + Size: val.Size, + Alignment: val.Alignment, + } + + OkArm := val.Members[0] + ci := c.compileCamelCompoundIdentifier(OkArm.Type.Identifier) + + // always a struct on the Ok arms in Results + for _, v := range root.Structs { + if v.Name == ci { + for _, m := range v.Members { + r.Ok = append(r.Ok, m.Type) + } + } + } + + return r +} + func (c *compiler) compileUnion(val types.Union) Union { r := Union{ Attributes: val.Attributes, @@ -772,7 +807,12 @@ func Compile(r types.Root) Root { } for _, v := range r.Unions { - root.Unions = append(root.Unions, c.compileUnion(v)) + // Results are a specialized type of Union + if v.Attributes.HasAttribute("Result") { + root.Results = append(root.Results, c.compileResult(v, root)) + } else { + root.Unions = append(root.Unions, c.compileUnion(v)) + } } for _, v := range r.Tables { diff --git a/garnet/go/src/fidl/compiler/backend/rust/templates/result.tmpl.go b/garnet/go/src/fidl/compiler/backend/rust/templates/result.tmpl.go new file mode 100644 index 0000000000000000000000000000000000000000..8dfd797249f73b410b8a2c1a1a052bb584617bdb --- /dev/null +++ b/garnet/go/src/fidl/compiler/backend/rust/templates/result.tmpl.go @@ -0,0 +1,21 @@ +// 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 templates + +const Result = ` +{{- define "ResultDeclaration" }} +type {{ .Name }} = std::result::Result< ( + {{- if gt (len .Ok) 1 }} + {{- range $ok_member_type := .Ok }} + {{ $ok_member_type }}, + {{- end }} + {{- else }} + {{- range $ok_member_type := .Ok }} + {{ $ok_member_type }} + {{- end }} + {{- end }} +), {{ .Err.Type.Decl }} >; +{{- end }} +` diff --git a/garnet/go/src/fidl/compiler/backend/rust/templates/sourcefile.tmpl.go b/garnet/go/src/fidl/compiler/backend/rust/templates/sourcefile.tmpl.go index f63256bed05267b7c83a78a1ba62091dfe6bbc28..cd0a824bc7ef5b97ee1c9b4510a7101e537cbecd 100644 --- a/garnet/go/src/fidl/compiler/backend/rust/templates/sourcefile.tmpl.go +++ b/garnet/go/src/fidl/compiler/backend/rust/templates/sourcefile.tmpl.go @@ -38,6 +38,9 @@ use fidl::{ {{ range $enum := .Enums -}} {{ template "EnumDeclaration" $enum }} {{ end -}} +{{ range $result := .Results -}} +{{ template "ResultDeclaration" $result}} +{{ end -}} {{ range $union := .Unions -}} {{ template "UnionDeclaration" $union }} {{ end -}} diff --git a/garnet/go/src/fidl/compiler/backend/rust/templates/union.tmpl.go b/garnet/go/src/fidl/compiler/backend/rust/templates/union.tmpl.go index 4d26d627e9b13302de0e225acd04e977be719422..aa66c6b24eafb3a433e13952bf078f58fdcdf7d4 100644 --- a/garnet/go/src/fidl/compiler/backend/rust/templates/union.tmpl.go +++ b/garnet/go/src/fidl/compiler/backend/rust/templates/union.tmpl.go @@ -6,15 +6,12 @@ package templates const Union = ` {{- define "UnionDeclaration" }} -{{- if .HasAttribute "Result" }} -type {{ .Name }} = std::result::Result< {{(index .Members 0).Type }} , {{ (index .Members 1).Type }} >; -{{ else }} fidl_union! { name: {{ .Name }}, members: [ {{- range .Members }} {{ .Name }} { - ty: {{ .Type }}, + ty: {{ .Type.Decl }}, offset: {{ .Offset }}, }, {{- end }} @@ -23,5 +20,4 @@ fidl_union! { align: {{ .Alignment }}, } {{- end }} -{{- end }} ` diff --git a/src/connectivity/telephony/ril-qmi/src/main.rs b/src/connectivity/telephony/ril-qmi/src/main.rs index df1a716b5c05117c1a9e5618dc644e056b966a2b..6972de7a0b11cf515b6e8e9fee7712722c8afada 100644 --- a/src/connectivity/telephony/ril-qmi/src/main.rs +++ b/src/connectivity/telephony/ril-qmi/src/main.rs @@ -156,10 +156,9 @@ impl FrilService { let status = lock.connect_transport(channel); fx_log_info!("Connecting the service to the transport driver: {}", status); if status { - return responder.send(&mut Ok(RadioInterfaceLayerConnectTransportResponse {})); - } else { - return responder.send(&mut Ok(RadioInterfaceLayerConnectTransportResponse {})); + return responder.send(&mut Ok(())); } + responder.send(&mut Err(RilError::TransportError))? } RadioInterfaceLayerRequest::GetSignalStrength { responder } => { let resp: NAS::GetSignalStrengthResp = @@ -167,24 +166,19 @@ impl FrilService { if resp.radio_interface != 0x08 { responder.send(&mut Err(RilError::UnsupportedNetworkType))? } else { - responder.send(&mut Ok(RadioInterfaceLayerGetSignalStrengthResponse { - // TODO(bwb): This is wrong. Temporary fix for API review - dbm: resp.signal_strength as f32, - }))? + responder.send(&mut Ok(resp.signal_strength as f32))? } } RadioInterfaceLayerRequest::GetNetworkSettings { responder } => { let packet: WDS::GetCurrentSettingsResp = qmi_query!(responder, client, WDS::GetCurrentSettingsReq::new(58160)); - responder.send(&mut Ok(RadioInterfaceLayerGetNetworkSettingsResponse { - settings: NetworkSettings { + responder.send(&mut Ok(NetworkSettings { ip_v4_addr: packet.ipv4_addr.unwrap(), ip_v4_dns: packet.ipv4_dns.unwrap(), ip_v4_subnet: packet.ipv4_subnet.unwrap(), ip_v4_gateway: packet.ipv4_gateway.unwrap(), mtu: packet.mtu.unwrap(), - }, - }))? + }))? } RadioInterfaceLayerRequest::StartNetwork { apn, responder } => { let packet: WDS::StartNetworkInterfaceResp = qmi_query!( @@ -201,27 +195,20 @@ impl FrilService { }); } let client_end = ClientEnd::<NetworkConnectionMarker>::new(client_chan.into()); - responder - .send(&mut Ok(RadioInterfaceLayerStartNetworkResponse { conn: client_end }))? + responder.send(&mut Ok(client_end))? } RadioInterfaceLayerRequest::GetDeviceIdentity { responder } => { let resp: DMS::GetDeviceSerialNumbersResp = qmi_query!(responder, client, DMS::GetDeviceSerialNumbersReq::new()); - responder.send(&mut Ok(RadioInterfaceLayerGetDeviceIdentityResponse { - imei: resp.imei, - }))? + responder.send(&mut Ok(resp.imei))? } RadioInterfaceLayerRequest::RadioPowerStatus { responder } => { let resp: DMS::GetOperatingModeResp = qmi_query!(responder, client, DMS::GetOperatingModeReq::new()); if resp.operating_mode == 0x00 { - responder.send(&mut Ok(RadioInterfaceLayerRadioPowerStatusResponse { - state: RadioPowerState::On, - }))? + responder.send(&mut Ok(RadioPowerState::On))? } else { - responder.send(&mut Ok(RadioInterfaceLayerRadioPowerStatusResponse { - state: RadioPowerState::Off, - }))? + responder.send(&mut Ok(RadioPowerState::Off))? } } } diff --git a/src/connectivity/telephony/tools/ril-ctl/src/main.rs b/src/connectivity/telephony/tools/ril-ctl/src/main.rs index b33562c8d598b8d75ae5bd674d581ec9022ef387..fdbae546aef5f189a4c1b8d4bb6b4362f04f43d5 100644 --- a/src/connectivity/telephony/tools/ril-ctl/src/main.rs +++ b/src/connectivity/telephony/tools/ril-ctl/src/main.rs @@ -93,7 +93,7 @@ async fn get_imei<'a>( ril_modem: &'a RadioInterfaceLayerProxy, ) -> Result<String, Error> { match await!(ril_modem.get_device_identity())? { - Ok(imei) => Ok(imei.imei), + Ok(imei) => Ok(imei), Err(_state) => Err(format_err!("error")), } } @@ -106,7 +106,7 @@ async fn connect<'a>( Ok(iface) => { let settings = await!(ril_modem.get_network_settings())?; if let Ok(settings) = settings { - return Ok((settings.settings, iface.conn.into_proxy()?)); + return Ok((settings, iface.into_proxy()?)); } Err(format_err!("error")) } @@ -119,7 +119,7 @@ async fn get_power<'a>( ril_modem: &'a RadioInterfaceLayerProxy, ) -> Result<String, Error> { match await!(ril_modem.radio_power_status())? { - Ok(state) => match state.state { + Ok(state) => match state { RadioPowerState::On => Ok(String::from("radio on")), RadioPowerState::Off => Ok(String::from("radio off")), }, @@ -133,7 +133,7 @@ async fn get_signal<'a>( ) -> Result<String, Error> { match await!(ril_modem.get_signal_strength())? { Ok(strength) => { - Ok(format!("{} dBm", strength.dbm)) + Ok(format!("{} dBm", strength)) }, Err(_e) => Err(format_err!("error")), }