use super::BounceBufferSpec;
use derive_builder::Builder;
use std::{ops::Range, sync::Arc};
#[derive(Clone, Default, Builder)]
#[builder(pattern = "owned", default)]
pub struct TransferOptions {
#[builder(default, setter(strip_option))]
pub layer_range: Option<Range<usize>>,
#[builder(default, setter(strip_option))]
pub nixl_write_notification: Option<u64>,
#[builder(default, setter(strip_option, into))]
pub bounce_buffer: Option<Arc<dyn BounceBufferSpec>>,
}
impl TransferOptions {
pub fn builder() -> TransferOptionsBuilder {
TransferOptionsBuilder::default()
}
pub fn from_layer_range(layer_range: Option<Range<usize>>) -> Self {
Self {
layer_range,
..Self::default()
}
}
pub fn new() -> Self {
Self::default()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_options() {
let options = TransferOptions::default();
assert!(options.layer_range.is_none());
assert!(options.nixl_write_notification.is_none());
assert!(options.bounce_buffer.is_none());
}
#[test]
fn test_builder_with_notification() {
let options = TransferOptions::builder()
.nixl_write_notification(42)
.build()
.unwrap();
assert_eq!(options.nixl_write_notification, Some(42));
assert!(options.layer_range.is_none());
}
#[test]
fn test_builder_with_layer_range() {
let options = TransferOptions::builder()
.layer_range(0..10)
.build()
.unwrap();
assert_eq!(options.layer_range, Some(0..10));
assert!(options.nixl_write_notification.is_none());
}
#[test]
fn test_builder_with_all_options() {
let options = TransferOptions::builder()
.nixl_write_notification(100)
.layer_range(5..15)
.build()
.unwrap();
assert_eq!(options.nixl_write_notification, Some(100));
assert_eq!(options.layer_range, Some(5..15));
}
}