use super::{ExportFormat, Filter};
#[derive(Debug, Clone)]
#[allow(clippy::struct_excessive_bools)]
pub struct ExportOptions {
pub format: ExportFormat,
pub pretty: bool,
pub include_metadata: bool,
pub include_comments: bool,
pub compact: bool,
pub filter: Option<Filter>,
pub template: Option<String>,
}
impl Default for ExportOptions {
fn default() -> Self {
Self {
format: ExportFormat::default(),
pretty: true,
include_metadata: true,
include_comments: false,
compact: false,
filter: None,
template: None,
}
}
}
impl ExportOptions {
#[must_use]
pub fn builder() -> ExportOptionsBuilder {
ExportOptionsBuilder::default()
}
}
#[derive(Debug, Default)]
pub struct ExportOptionsBuilder {
format: Option<ExportFormat>,
pretty: Option<bool>,
include_metadata: Option<bool>,
include_comments: Option<bool>,
compact: Option<bool>,
filter: Option<Filter>,
template: Option<String>,
}
impl ExportOptionsBuilder {
#[must_use]
pub fn format(mut self, format: ExportFormat) -> Self {
self.format = Some(format);
self
}
#[must_use]
pub fn pretty(mut self, pretty: bool) -> Self {
self.pretty = Some(pretty);
self
}
#[must_use]
pub fn include_metadata(mut self, include: bool) -> Self {
self.include_metadata = Some(include);
self
}
#[must_use]
pub fn include_comments(mut self, include: bool) -> Self {
self.include_comments = Some(include);
self
}
#[must_use]
pub fn compact(mut self, compact: bool) -> Self {
self.compact = Some(compact);
self
}
#[must_use]
pub fn filter(mut self, filter: Filter) -> Self {
self.filter = Some(filter);
self
}
#[must_use]
pub fn template(mut self, template: impl Into<String>) -> Self {
self.template = Some(template.into());
self
}
#[must_use]
pub fn build(self) -> ExportOptions {
let defaults = ExportOptions::default();
ExportOptions {
format: self.format.unwrap_or(defaults.format),
pretty: self.pretty.unwrap_or(defaults.pretty),
include_metadata: self.include_metadata.unwrap_or(defaults.include_metadata),
include_comments: self.include_comments.unwrap_or(defaults.include_comments),
compact: self.compact.unwrap_or(defaults.compact),
filter: self.filter.or(defaults.filter),
template: self.template.or(defaults.template),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_options() {
let options = ExportOptions::default();
assert_eq!(options.format, ExportFormat::Json);
assert!(options.pretty);
assert!(options.include_metadata);
assert!(!options.include_comments);
assert!(!options.compact);
}
#[test]
fn test_builder() {
let options = ExportOptions::builder()
.format(ExportFormat::Yaml)
.pretty(false)
.compact(true)
.build();
assert_eq!(options.format, ExportFormat::Yaml);
assert!(!options.pretty);
assert!(options.compact);
}
#[test]
fn test_builder_partial() {
let options = ExportOptions::builder().format(ExportFormat::Json).build();
assert!(options.pretty);
assert!(options.include_metadata);
}
#[test]
fn test_builder_all_options() {
let options = ExportOptions::builder()
.format(ExportFormat::Yaml)
.pretty(false)
.include_metadata(false)
.include_comments(true)
.compact(true)
.template("custom.md")
.build();
assert_eq!(options.format, ExportFormat::Yaml);
assert!(!options.pretty);
assert!(!options.include_metadata);
assert!(options.include_comments);
assert!(options.compact);
assert_eq!(options.template.as_deref(), Some("custom.md"));
}
#[test]
fn test_builder_chaining() {
let options = ExportOptions::builder()
.format(ExportFormat::Json)
.pretty(true)
.include_metadata(true)
.include_comments(false)
.compact(false)
.build();
assert_eq!(options.format, ExportFormat::Json);
assert!(options.pretty);
}
}