| // Copyright 2019 The Fuchsia Authors |
| // |
| // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 |
| // <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT |
| // license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option. |
| // This file may not be copied, modified, or distributed except according to |
| // those terms. |
| |
| use syn::{Data, DataEnum, DataStruct, DataUnion, Type}; |
| |
| pub trait DataExt { |
| /// Extract the types of all fields. For enums, extract the types of fields |
| /// from each variant. |
| fn field_types(&self) -> Vec<&Type>; |
| } |
| |
| impl DataExt for Data { |
| fn field_types(&self) -> Vec<&Type> { |
| match self { |
| Data::Struct(strc) => strc.field_types(), |
| Data::Enum(enm) => enm.field_types(), |
| Data::Union(un) => un.field_types(), |
| } |
| } |
| } |
| |
| impl DataExt for DataStruct { |
| fn field_types(&self) -> Vec<&Type> { |
| self.fields.iter().map(|f| &f.ty).collect() |
| } |
| } |
| |
| impl DataExt for DataEnum { |
| fn field_types(&self) -> Vec<&Type> { |
| self.variants.iter().flat_map(|var| &var.fields).map(|f| &f.ty).collect() |
| } |
| } |
| |
| impl DataExt for DataUnion { |
| fn field_types(&self) -> Vec<&Type> { |
| self.fields.named.iter().map(|f| &f.ty).collect() |
| } |
| } |
| |
| pub trait EnumExt { |
| fn is_c_like(&self) -> bool; |
| } |
| |
| impl EnumExt for DataEnum { |
| fn is_c_like(&self) -> bool { |
| self.field_types().is_empty() |
| } |
| } |