@@ -25,25 +25,20 @@ pub struct TunerHolder {
2525
2626/// Can be used to construct a [TunerHolder] without needing to manually construct each
2727/// [SlotSupplier]. Useful for lang bridges to allow more easily passing through user options.
28- #[ derive( Clone , Debug , derive_builder :: Builder ) ]
29- #[ builder( build_fn ( validate = "Self::validate" ) ) ]
28+ #[ derive( Clone , Debug , bon :: Builder ) ]
29+ #[ builder( finish_fn ( vis = "" , name = build_internal ) ) ]
3030#[ non_exhaustive]
3131pub struct TunerHolderOptions {
3232 /// Options for workflow slots
33- #[ builder( default , setter( strip_option) ) ]
3433 pub workflow_slot_options : Option < SlotSupplierOptions < WorkflowSlotKind > > ,
3534 /// Options for activity slots
36- #[ builder( default , setter( strip_option) ) ]
3735 pub activity_slot_options : Option < SlotSupplierOptions < ActivitySlotKind > > ,
3836 /// Options for local activity slots
39- #[ builder( default , setter( strip_option) ) ]
4037 pub local_activity_slot_options : Option < SlotSupplierOptions < LocalActivitySlotKind > > ,
4138 /// Options for nexus slots
42- #[ builder( default , setter( strip_option) ) ]
4339 pub nexus_slot_options : Option < SlotSupplierOptions < NexusSlotKind > > ,
4440 /// Options that will apply to all resource based slot suppliers. Must be set if any slot
4541 /// options are [SlotSupplierOptions::ResourceBased]
46- #[ builder( default , setter( strip_option) ) ]
4742 pub resource_based_options : Option < ResourceBasedSlotsOptions > ,
4843}
4944
@@ -150,35 +145,42 @@ pub enum SlotSupplierOptions<SK: SlotKind> {
150145 Custom ( Arc < dyn SlotSupplier < SlotKind = SK > + Send + Sync > ) ,
151146}
152147
153- impl TunerHolderOptionsBuilder {
148+ impl < State : tuner_holder_options_builder:: IsComplete > TunerHolderOptionsBuilder < State > {
149+ /// Build the [TunerHolderOptions] with validation
150+ pub fn build ( self ) -> Result < TunerHolderOptions , String > {
151+ let options = self . build_internal ( ) ;
152+ validate_tuner_holder_options ( & options) ?;
153+ Ok ( options)
154+ }
155+
154156 /// Create a [TunerHolder] from this builder
155157 pub fn build_tuner_holder ( self ) -> Result < TunerHolder , anyhow:: Error > {
156- let s = self . build ( ) ?;
158+ let s = self . build ( ) . map_err ( | e : String | anyhow :: anyhow! ( e ) ) ?;
157159 s. build_tuner_holder ( )
158160 }
161+ }
159162
160- fn validate ( & self ) -> Result < ( ) , String > {
161- let any_is_resource_based = matches ! (
162- self . workflow_slot_options,
163- Some ( Some ( SlotSupplierOptions :: ResourceBased ( _) ) )
164- ) || matches ! (
165- self . activity_slot_options,
166- Some ( Some ( SlotSupplierOptions :: ResourceBased ( _) ) )
167- ) || matches ! (
168- self . local_activity_slot_options,
169- Some ( Some ( SlotSupplierOptions :: ResourceBased ( _) ) )
170- ) || matches ! (
171- self . nexus_slot_options,
172- Some ( Some ( SlotSupplierOptions :: ResourceBased ( _) ) )
163+ fn validate_tuner_holder_options ( options : & TunerHolderOptions ) -> Result < ( ) , String > {
164+ let any_is_resource_based = matches ! (
165+ options. workflow_slot_options,
166+ Some ( SlotSupplierOptions :: ResourceBased ( _) )
167+ ) || matches ! (
168+ options. activity_slot_options,
169+ Some ( SlotSupplierOptions :: ResourceBased ( _) )
170+ ) || matches ! (
171+ options. local_activity_slot_options,
172+ Some ( SlotSupplierOptions :: ResourceBased ( _) )
173+ ) || matches ! (
174+ options. nexus_slot_options,
175+ Some ( SlotSupplierOptions :: ResourceBased ( _) )
176+ ) ;
177+ if any_is_resource_based && options. resource_based_options . is_none ( ) {
178+ return Err (
179+ "`resource_based_options` must be set if any slot options are ResourceBased"
180+ . to_string ( ) ,
173181 ) ;
174- if any_is_resource_based && matches ! ( self . resource_based_options, None | Some ( None ) ) {
175- return Err (
176- "`resource_based_options` must be set if any slot options are ResourceBased"
177- . to_string ( ) ,
178- ) ;
179- }
180- Ok ( ( ) )
181182 }
183+ Ok ( ( ) )
182184}
183185
184186/// Can be used to construct a `TunerHolder` from individual slot suppliers. Any supplier which is
@@ -348,11 +350,10 @@ mod tests {
348350
349351 #[ test]
350352 fn tuner_holder_options_nexus_resource_based ( ) {
351- let resource_opts = ResourceBasedSlotsOptionsBuilder :: default ( )
353+ let resource_opts = ResourceBasedSlotsOptions :: builder ( )
352354 . target_mem_usage ( 0.8 )
353355 . target_cpu_usage ( 0.9 )
354- . build ( )
355- . unwrap ( ) ;
356+ . build ( ) ;
356357
357358 let options = TunerHolderOptions {
358359 workflow_slot_options : None ,
@@ -403,7 +404,7 @@ mod tests {
403404 #[ test]
404405 fn tuner_holder_options_builder_validates_resource_based_requirements ( ) {
405406 // Should fail when nexus uses ResourceBased but resource_based_options is not set
406- let result = TunerHolderOptionsBuilder :: default ( )
407+ let result = TunerHolderOptions :: builder ( )
407408 . nexus_slot_options ( SlotSupplierOptions :: ResourceBased (
408409 ResourceSlotOptions :: new ( 5 , 100 , Duration :: from_millis ( 100 ) ) ,
409410 ) )
@@ -420,11 +421,10 @@ mod tests {
420421
421422 #[ test]
422423 fn tuner_holder_options_all_slot_types ( ) {
423- let resource_opts = ResourceBasedSlotsOptionsBuilder :: default ( )
424+ let resource_opts = ResourceBasedSlotsOptions :: builder ( )
424425 . target_mem_usage ( 0.8 )
425426 . target_cpu_usage ( 0.9 )
426- . build ( )
427- . unwrap ( ) ;
427+ . build ( ) ;
428428
429429 let options = TunerHolderOptions {
430430 workflow_slot_options : Some ( SlotSupplierOptions :: FixedSize { slots : 10 } ) ,
0 commit comments