@@ -13,6 +13,7 @@ use crate::{
13
13
from_env:: { EnvItemInfo , FromEnv , FromEnvErr , FromEnvVar } ,
14
14
} ,
15
15
} ;
16
+ use serde:: { Deserialize , Deserializer } ;
16
17
17
18
/// The builder list env var.
18
19
const BUILDERS : & str = "PERMISSIONED_BUILDERS" ;
@@ -57,12 +58,19 @@ pub enum BuilderConfigError {
57
58
}
58
59
59
60
/// An individual builder.
60
- #[ derive( Clone , Debug ) ]
61
+ #[ derive( Clone , Debug , serde:: Deserialize ) ]
62
+ #[ serde( from = "String" ) ]
61
63
pub struct Builder {
62
64
/// The sub of the builder.
63
65
pub sub : String ,
64
66
}
65
67
68
+ impl From < String > for Builder {
69
+ fn from ( sub : String ) -> Self {
70
+ Self { sub }
71
+ }
72
+ }
73
+
66
74
impl Builder {
67
75
/// Create a new builder.
68
76
pub fn new ( sub : impl AsRef < str > ) -> Self {
@@ -78,19 +86,32 @@ impl Builder {
78
86
}
79
87
80
88
/// Builders struct to keep track of the builders that are allowed to perform actions.
81
- #[ derive( Clone , Debug ) ]
89
+ #[ derive( Clone , Debug , serde :: Deserialize ) ]
82
90
pub struct Builders {
83
91
/// The list of builders.
84
92
///
85
93
/// This is configured in the environment variable `PERMISSIONED_BUILDERS`,
86
94
/// as a list of comma-separated UUIDs.
95
+ #[ serde( deserialize_with = "deser_builders" ) ]
87
96
pub builders : Vec < Builder > ,
88
97
89
98
/// The slot authorization configuration. See [`SlotAuthzConfig`] for more
90
99
/// information and env vars
91
100
config : SlotAuthzConfig ,
92
101
}
93
102
103
+ fn deser_builders < ' de , D > ( deser : D ) -> Result < Vec < Builder > , D :: Error >
104
+ where
105
+ D : Deserializer < ' de > ,
106
+ {
107
+ let s = String :: deserialize ( deser) ?;
108
+ Ok ( split_builders ( & s) )
109
+ }
110
+
111
+ fn split_builders ( s : & str ) -> Vec < Builder > {
112
+ s. split ( ',' ) . map ( Builder :: new) . collect ( )
113
+ }
114
+
94
115
impl Builders {
95
116
/// Create a new Builders struct.
96
117
pub const fn new ( builders : Vec < Builder > , config : SlotAuthzConfig ) -> Self {
@@ -188,7 +209,7 @@ impl FromEnv for Builders {
188
209
fn from_env ( ) -> Result < Self , FromEnvErr < Self :: Error > > {
189
210
let s = String :: from_env_var ( BUILDERS )
190
211
. map_err ( FromEnvErr :: infallible_into :: < BuilderConfigError > ) ?;
191
- let builders = s . split ( ',' ) . map ( Builder :: new ) . collect ( ) ;
212
+ let builders = split_builders ( & s ) ;
192
213
193
214
let config = SlotAuthzConfig :: from_env ( ) . map_err ( FromEnvErr :: from) ?;
194
215
0 commit comments