sandbox/
data.rs

1// Copyright 2023 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4use fidl_fuchsia_component_sandbox as fsandbox;
5use std::fmt::Debug;
6
7use crate::{CapabilityBound, RemoteError};
8
9/// A capability that holds immutable data.
10#[derive(Debug, Clone, PartialEq, Eq)]
11pub enum Data {
12    Bytes(Box<[u8]>),
13    String(Box<str>),
14    Int64(i64),
15    Uint64(u64),
16}
17
18impl CapabilityBound for Data {
19    fn debug_typename() -> &'static str {
20        "Data"
21    }
22}
23
24impl TryFrom<fsandbox::Data> for Data {
25    type Error = RemoteError;
26
27    fn try_from(data_capability: fsandbox::Data) -> Result<Self, Self::Error> {
28        match data_capability {
29            fsandbox::Data::Bytes(bytes) => Ok(Self::Bytes(bytes.into())),
30            fsandbox::Data::String(string) => Ok(Self::String(string.into())),
31            fsandbox::Data::Int64(num) => Ok(Self::Int64(num)),
32            fsandbox::Data::Uint64(num) => Ok(Self::Uint64(num)),
33            fsandbox::DataUnknown!() => Err(RemoteError::UnknownVariant),
34        }
35    }
36}
37
38impl From<Data> for fsandbox::Data {
39    fn from(data: Data) -> Self {
40        match data {
41            Data::Bytes(bytes) => fsandbox::Data::Bytes(bytes.into()),
42            Data::String(string) => fsandbox::Data::String(string.into()),
43            Data::Int64(num) => fsandbox::Data::Int64(num),
44            Data::Uint64(num) => fsandbox::Data::Uint64(num),
45        }
46    }
47}
48
49impl From<Data> for fsandbox::Capability {
50    fn from(data: Data) -> Self {
51        Self::Data(data.into())
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58    use crate::Capability;
59    use assert_matches::assert_matches;
60
61    #[test]
62    fn clone() {
63        let data: Data = Data::String("abc".into());
64        let any: Capability = data.into();
65        let clone = any.try_clone().unwrap();
66        let data_back = assert_matches!(any, Capability::Data(d) => d);
67        let clone_data_back = assert_matches!(clone, Capability::Data(d) => d);
68        assert_eq!(data_back, clone_data_back);
69    }
70}