use hadris_iso::boot::options::BootOptions;
use hadris_iso::joliet::JolietLevel;
use hadris_iso::rrip::RripOptions;
use hadris_iso::write::options::{BaseIsoLevel, HybridBootOptions};
use hadris_udf::UdfRevision;
#[derive(Debug, Clone)]
pub struct CdOptions {
pub volume_id: String,
pub sector_size: usize,
pub iso: IsoOptions,
pub udf: UdfOptions,
pub boot: Option<BootOptions>,
pub hybrid_boot: Option<HybridBootOptions>,
}
impl Default for CdOptions {
fn default() -> Self {
Self {
volume_id: String::from("CDROM"),
sector_size: 2048,
iso: IsoOptions::default(),
udf: UdfOptions::default(),
boot: None,
hybrid_boot: None,
}
}
}
impl CdOptions {
pub fn with_volume_id(volume_id: impl Into<String>) -> Self {
Self {
volume_id: volume_id.into(),
..Default::default()
}
}
pub fn volume_id(mut self, id: impl Into<String>) -> Self {
self.volume_id = id.into();
self
}
pub fn with_joliet(mut self) -> Self {
self.iso.joliet = Some(JolietLevel::Level3);
self
}
pub fn with_rock_ridge(mut self) -> Self {
self.iso.rock_ridge = Some(RripOptions::default());
self
}
pub fn with_boot(mut self, boot: BootOptions) -> Self {
self.boot = Some(boot);
self
}
pub fn with_hybrid_boot(mut self, hybrid: HybridBootOptions) -> Self {
self.hybrid_boot = Some(hybrid);
self
}
pub fn iso_only(mut self) -> Self {
self.udf.enabled = false;
self
}
pub fn udf_only(mut self) -> Self {
self.iso.enabled = false;
self
}
}
#[derive(Debug, Clone)]
pub struct IsoOptions {
pub enabled: bool,
pub level: BaseIsoLevel,
pub long_filenames: bool,
pub joliet: Option<JolietLevel>,
pub rock_ridge: Option<RripOptions>,
}
impl Default for IsoOptions {
fn default() -> Self {
Self {
enabled: true,
level: BaseIsoLevel::Level2 {
supports_lowercase: false,
supports_rrip: false,
},
long_filenames: true,
joliet: Some(JolietLevel::Level3),
rock_ridge: None,
}
}
}
#[derive(Debug, Clone)]
pub struct UdfOptions {
pub enabled: bool,
pub revision: UdfRevision,
}
impl Default for UdfOptions {
fn default() -> Self {
Self {
enabled: true,
revision: UdfRevision::V1_02,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_options() {
let opts = CdOptions::default();
assert_eq!(opts.volume_id, "CDROM");
assert_eq!(opts.sector_size, 2048);
assert!(opts.iso.enabled);
assert!(opts.udf.enabled);
}
#[test]
fn test_builder_pattern() {
let opts = CdOptions::with_volume_id("MY_DISC")
.with_joliet()
.with_rock_ridge();
assert_eq!(opts.volume_id, "MY_DISC");
assert!(opts.iso.joliet.is_some());
assert!(opts.iso.rock_ridge.is_some());
}
}