morphir_core/ir/v4/
access.rs1use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
8pub enum Access {
9 Public,
10 Private,
11}
12
13impl Access {
14 pub fn tag(self) -> &'static str {
16 match self {
17 Access::Public => "Public",
18 Access::Private => "Private",
19 }
20 }
21
22 pub fn from_tag(tag: &str) -> Option<Access> {
28 match tag {
29 "Public" | "pub" | "public" => Some(Access::Public),
30 "Private" | "private" => Some(Access::Private),
31 _ => None,
32 }
33 }
34}
35
36#[derive(Debug, Clone, PartialEq)]
43pub struct AccessControlled<T> {
44 pub access: Access,
45 pub value: T,
46}
47
48impl<T: Serialize> Serialize for AccessControlled<T> {
49 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
50 where
51 S: serde::Serializer,
52 {
53 use serde::ser::SerializeMap;
54
55 let mut map = serializer.serialize_map(Some(1))?;
56 map.serialize_entry(self.access.tag(), &self.value)?;
57 map.end()
58 }
59}
60
61impl<'de, T> Deserialize<'de> for AccessControlled<T>
62where
63 T: for<'value> Deserialize<'value>,
64{
65 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
66 where
67 D: serde::Deserializer<'de>,
68 {
69 use super::serde_document::{carried, recover};
70
71 let value = serde_json::Value::deserialize(deserializer)?;
72 super::serde_document::decode_access_controlled(&value, "", |payload, cursor| {
73 serde_json::from_value::<T>(payload.clone()).map_err(|error| recover(&error, cursor))
74 })
75 .map_err(carried)
76 }
77}