2020//! // Request needed partitions
2121//! strategy.add_request(PartitionRequest {
2222//! size: SizeRequirement::Exact(512 * 1024 * 1024), // 512MB EFI partition
23+ //! attributes: None,
2324//! });
2425//! strategy.add_request(PartitionRequest {
2526//! size: SizeRequirement::Remaining, // Rest for root
27+ //! attributes: None,
2628//! });
2729//! ```
2830
2931use crate :: planner:: { PlanError , Planner } ;
3032
3133use crate :: planner:: Region ;
34+ use crate :: PartitionAttributes ;
3235
3336/// Strategy for allocating partitions
3437#[ derive( Debug , Clone ) ]
@@ -61,6 +64,7 @@ pub enum SizeRequirement {
6164#[ derive( Debug , Clone ) ]
6265pub struct PartitionRequest {
6366 pub size : SizeRequirement ,
67+ pub attributes : Option < PartitionAttributes > ,
6468}
6569
6670/// Handles planning partition layouts according to specific strategies
@@ -201,15 +205,15 @@ impl Strategy {
201205 // First pass: allocate exact size partitions
202206 for request in & self . requests {
203207 if let SizeRequirement :: Exact ( size) = request. size {
204- planner. plan_add_partition ( current, current + size) ?;
208+ planner. plan_add_partition_with_attributes ( current, current + size, request . attributes . clone ( ) ) ?;
205209 current += size;
206210 remaining -= size;
207211 }
208212 }
209213
210214 // Second pass: allocate flexible partitions
211215 let mut remaining_flexible = flexible_requests. len ( ) ;
212- for ( _idx , min, max_opt) in & flexible_requests {
216+ for ( idx , min, max_opt) in & flexible_requests {
213217 remaining_flexible -= 1 ;
214218
215219 // First verify we have enough space for minimum requirement
@@ -243,7 +247,11 @@ impl Strategy {
243247 }
244248 } ;
245249
246- match planner. plan_add_partition ( current, current + size) {
250+ match planner. plan_add_partition_with_attributes (
251+ current,
252+ current + size,
253+ self . requests . get ( * idx) . and_then ( |r| r. attributes . clone ( ) ) ,
254+ ) {
247255 Ok ( _) => {
248256 current += size;
249257 remaining -= size;
@@ -284,6 +292,7 @@ mod tests {
284292 fn root_partition ( ) -> PartitionRequest {
285293 PartitionRequest {
286294 size : SizeRequirement :: AtLeast ( ROOT_MIN ) ,
295+ attributes : None ,
287296 }
288297 }
289298
@@ -294,20 +303,23 @@ mod tests {
294303 min : ROOT_MIN ,
295304 max : ROOT_MAX ,
296305 } ,
306+ attributes : None ,
297307 }
298308 }
299309
300310 /// Creates a standard EFI system partition request
301311 fn efi_partition ( ) -> PartitionRequest {
302312 PartitionRequest {
303313 size : SizeRequirement :: Exact ( EFI_SIZE ) ,
314+ attributes : None ,
304315 }
305316 }
306317
307318 /// Creates a /boot partition request
308319 fn boot_partition ( ) -> PartitionRequest {
309320 PartitionRequest {
310321 size : SizeRequirement :: Exact ( BOOT_SIZE ) ,
322+ attributes : None ,
311323 }
312324 }
313325
@@ -318,13 +330,15 @@ mod tests {
318330 min : SWAP_MIN ,
319331 max : SWAP_MAX ,
320332 } ,
333+ attributes : None ,
321334 }
322335 }
323336
324337 /// Creates a home partition request that uses all remaining space
325338 fn home_partition ( ) -> PartitionRequest {
326339 PartitionRequest {
327340 size : SizeRequirement :: Remaining ,
341+ attributes : None ,
328342 }
329343 }
330344 fn create_test_disk ( ) -> MockDisk {
@@ -395,6 +409,7 @@ mod tests {
395409 strategy. add_request ( boot_partition ( ) ) ;
396410 strategy. add_request ( PartitionRequest {
397411 size : SizeRequirement :: Remaining ,
412+ attributes : None ,
398413 } ) ;
399414
400415 eprintln ! ( "\n Minimal Server Strategy:\n {}" , strategy. describe( ) ) ;
@@ -414,6 +429,7 @@ mod tests {
414429 // Try to allocate more than available
415430 strategy. add_request ( PartitionRequest {
416431 size : SizeRequirement :: Exact ( 20 * GB ) ,
432+ attributes : None ,
417433 } ) ;
418434
419435 assert ! ( strategy. apply( & mut planner) . is_err( ) ) ;
@@ -428,9 +444,11 @@ mod tests {
428444 // Request more than available in flexible partitions
429445 strategy. add_request ( PartitionRequest {
430446 size : SizeRequirement :: AtLeast ( 6 * GB ) ,
447+ attributes : None ,
431448 } ) ;
432449 strategy. add_request ( PartitionRequest {
433450 size : SizeRequirement :: AtLeast ( 6 * GB ) ,
451+ attributes : None ,
434452 } ) ;
435453
436454 // Should fail because total minimum (12GB) exceeds disk size (10GB)
@@ -448,18 +466,21 @@ mod tests {
448466 // Request sequence where first two would fit but third won't
449467 strategy. add_request ( PartitionRequest {
450468 size : SizeRequirement :: Range { min : GB , max : 2 * GB } ,
469+ attributes : None ,
451470 } ) ;
452471 strategy. add_request ( PartitionRequest {
453472 size : SizeRequirement :: Range {
454473 min : 2 * GB ,
455474 max : 4 * GB ,
456475 } ,
476+ attributes : None ,
457477 } ) ;
458478 strategy. add_request ( PartitionRequest {
459479 size : SizeRequirement :: Range {
460480 min : 25 * GB ,
461481 max : 120 * GB ,
462482 } ,
483+ attributes : None ,
463484 } ) ;
464485
465486 // Should fail and undo partial changes
0 commit comments