cedar_policy/proto/
api.rs1use super::super::api;
18use super::{models, traits};
19
20macro_rules! standard_conversions {
24 ( $A:ty, $A_expr:expr, $B:ty ) => {
25 impl From<&$A> for $B {
26 fn from(v: &$A) -> $B {
27 Self::from(&v.0)
28 }
29 }
30
31 impl From<&$B> for $A {
32 fn from(v: &$B) -> $A {
33 $A_expr(v.into())
34 }
35 }
36 };
37}
38
39standard_conversions!(api::Entity, api::Entity, models::Entity);
42standard_conversions!(api::EntityUid, api::EntityUid, models::EntityUid);
43standard_conversions!(api::Entities, api::Entities, models::Entities);
44standard_conversions!(api::Schema, api::Schema, models::Schema);
45standard_conversions!(api::EntityTypeName, api::EntityTypeName, models::Name);
46standard_conversions!(api::EntityNamespace, api::EntityNamespace, models::Name);
47standard_conversions!(api::Expression, api::Expression, models::Expr);
48standard_conversions!(api::Request, api::Request, models::Request);
49
50impl From<&api::Template> for models::TemplateBody {
53 fn from(v: &api::Template) -> Self {
54 Self::from(&v.ast)
55 }
56}
57
58impl From<&models::TemplateBody> for api::Template {
59 fn from(v: &models::TemplateBody) -> Self {
60 Self::from_ast(v.into())
61 }
62}
63
64impl From<&api::Policy> for models::Policy {
65 fn from(v: &api::Policy) -> Self {
66 Self::from(&v.ast)
67 }
68}
69
70impl From<&api::PolicySet> for models::PolicySet {
71 fn from(v: &api::PolicySet) -> Self {
72 Self::from(&v.ast)
73 }
74}
75
76impl TryFrom<&models::PolicySet> for api::PolicySet {
77 type Error = api::PolicySetError;
78 fn try_from(v: &models::PolicySet) -> Result<Self, Self::Error> {
79 #[allow(clippy::expect_used)]
81 Self::from_ast(
82 v.try_into()
83 .expect("proto-encoded policy set should be a valid policy set"),
84 )
85 }
86}
87
88#[allow(clippy::use_self)]
89impl From<&api::ValidationMode> for models::ValidationMode {
90 fn from(v: &api::ValidationMode) -> Self {
91 match v {
92 api::ValidationMode::Strict => models::ValidationMode::Strict,
93 #[cfg(feature = "permissive-validate")]
94 api::ValidationMode::Permissive => models::ValidationMode::Permissive,
95 #[cfg(feature = "partial-validate")]
96 api::ValidationMode::Partial => models::ValidationMode::Partial,
97 }
98 }
99}
100
101#[allow(clippy::use_self)]
102impl From<&models::ValidationMode> for api::ValidationMode {
103 fn from(v: &models::ValidationMode) -> Self {
104 match v {
105 models::ValidationMode::Strict => api::ValidationMode::Strict,
106 #[cfg(feature = "permissive-validate")]
107 models::ValidationMode::Permissive => api::ValidationMode::Permissive,
108 #[cfg(not(feature = "permissive-validate"))]
109 models::ValidationMode::Permissive => panic!("Protobuf specifies permissive validation, but `permissive-validate` feature not enabled in this build"),
110 #[cfg(feature = "partial-validate")]
111 models::ValidationMode::Partial => api::ValidationMode::Partial,
112 #[cfg(not(feature = "partial-validate"))]
113 models::ValidationMode::Partial => panic!("Protobuf specifies partial validation, but `partial-validate` feature not enabled in this build"),
114 }
115 }
116}
117
118macro_rules! standard_protobuf_impl {
121 ( $api:ty, $model:ty ) => {
122 impl traits::Protobuf for $api {
123 fn encode(&self) -> Vec<u8> {
124 traits::encode_to_vec::<$model>(self)
125 }
126 fn decode(buf: impl prost::bytes::Buf) -> Result<Self, prost::DecodeError> {
127 traits::decode::<$model, _>(buf)
128 }
129 }
130 };
131}
132
133standard_protobuf_impl!(api::Entity, models::Entity);
136standard_protobuf_impl!(api::Entities, models::Entities);
137standard_protobuf_impl!(api::Schema, models::Schema);
138standard_protobuf_impl!(api::EntityTypeName, models::Name);
139standard_protobuf_impl!(api::EntityNamespace, models::Name);
140standard_protobuf_impl!(api::Template, models::TemplateBody);
141standard_protobuf_impl!(api::Expression, models::Expr);
142standard_protobuf_impl!(api::Request, models::Request);
143
144impl traits::Protobuf for api::PolicySet {
147 fn encode(&self) -> Vec<u8> {
148 traits::encode_to_vec::<models::PolicySet>(self)
149 }
150 fn decode(buf: impl prost::bytes::Buf) -> Result<Self, prost::DecodeError> {
151 #[allow(clippy::expect_used)]
153 Ok(traits::try_decode::<models::PolicySet, _, Self>(buf)?
154 .expect("protobuf-encoded policy set should be a valid policy set"))
155 }
156}