blob: d41a990dcd28aeb9f34cb6ee9e0256624aeced00 [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.
//! Traits for use with the rust client library for cobalt.
/// `AsEventCode` is any type that can be converted into a `u32` for the purposes of reporting to
/// cobalt.
pub trait AsEventCode {
fn as_event_code(&self) -> u32;
}
impl AsEventCode for u32 {
fn as_event_code(&self) -> u32 {
*self
}
}
/// `AsEventCodes` is any type that can be converted into a `Vec<u32>` for the purposes of reporting
/// to cobalt.
pub trait AsEventCodes {
/// Converts the source type into a `Vec<u32>` of event codes.
fn as_event_codes(&self) -> Vec<u32>;
}
impl AsEventCodes for () {
fn as_event_codes(&self) -> Vec<u32> {
Vec::new()
}
}
impl<A: AsEventCode> AsEventCodes for A {
fn as_event_codes(&self) -> Vec<u32> {
vec![self.as_event_code()]
}
}
impl<A: AsEventCode> AsEventCodes for Vec<A> {
fn as_event_codes(&self) -> Vec<u32> {
self.iter().map(AsEventCode::as_event_code).collect()
}
}
impl<A: AsEventCode> AsEventCodes for [A] {
fn as_event_codes(&self) -> Vec<u32> {
self.iter().map(AsEventCode::as_event_code).collect()
}
}
macro_rules! array_impls {
($($N:expr)+) => {
$(
impl<A: AsEventCode> AsEventCodes for [A; $N] {
fn as_event_codes(&self) -> Vec<u32> {
self[..].as_event_codes()
}
}
)+
}
}
array_impls! {0 1 2 3 4 5 6}
macro_rules! tuple_impls {
($(($($N:ident => $i:tt),*)),*) => {
$(
impl <$($N: AsEventCode),*> AsEventCodes for ($($N),*,) {
fn as_event_codes(&self) -> Vec<u32> {
vec![$(
self.$i.as_event_code()
),*]
}
}
)*
}
}
tuple_impls! {
(A => 0),
(A => 0, B => 1),
(A => 0, B => 1, C => 2),
(A => 0, B => 1, C => 2, D => 3),
(A => 0, B => 1, C => 2, D => 3, E => 4),
(A => 0, B => 1, C => 2, D => 3, E => 4, F => 5)
}
#[cfg(test)]
mod tests {
use super::*;
#[derive(Clone, Copy)]
enum EventCode1 {
A = 1,
B = 2,
}
impl AsEventCode for EventCode1 {
fn as_event_code(&self) -> u32 {
*self as u32
}
}
#[derive(Clone, Copy)]
enum EventCode2 {
C = 3,
D = 4,
}
impl AsEventCode for EventCode2 {
fn as_event_code(&self) -> u32 {
*self as u32
}
}
#[test]
fn test_as_event_codes() {
assert_eq!(().as_event_codes(), vec![]);
assert_eq!(([] as [u32; 0]).as_event_codes(), vec![]);
assert_eq!(1.as_event_codes(), vec![1]);
assert_eq!([1].as_event_codes(), vec![1]);
assert_eq!(vec![1].as_event_codes(), vec![1]);
assert_eq!([1, 2].as_event_codes(), vec![1, 2]);
assert_eq!(vec![1, 2].as_event_codes(), vec![1, 2]);
assert_eq!([1, 2, 3].as_event_codes(), vec![1, 2, 3]);
assert_eq!(vec![1, 2, 3].as_event_codes(), vec![1, 2, 3]);
assert_eq!([1, 2, 3, 4].as_event_codes(), vec![1, 2, 3, 4]);
assert_eq!(vec![1, 2, 3, 4].as_event_codes(), vec![1, 2, 3, 4]);
assert_eq!([1, 2, 3, 4, 5].as_event_codes(), vec![1, 2, 3, 4, 5]);
assert_eq!(vec![1, 2, 3, 4, 5].as_event_codes(), vec![1, 2, 3, 4, 5]);
assert_eq!((EventCode1::A, EventCode2::C).as_event_codes(), vec![1, 3]);
assert_eq!(
(0, EventCode1::B, 10, EventCode2::D).as_event_codes(),
vec![0, 2, 10, 4]
);
}
}